summaryrefslogtreecommitdiffstats
path: root/layout/generic
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2019-12-22 01:23:56 +0100
committerwolfbeast <mcwerewolf@wolfbeast.com>2019-12-22 01:26:49 +0100
commit54091ecab46c93c2e1b2c689e9179a980beaabe6 (patch)
tree5cead66d889007e1b06c5dbb8e3d37b2538d0557 /layout/generic
parentc1013e9122456b342d65e4eb4c38a7281d8d83d2 (diff)
parent492624a7106ecbc18994b465ca1dd23fa472bf7e (diff)
downloadUXP-54091ecab46c93c2e1b2c689e9179a980beaabe6.tar
UXP-54091ecab46c93c2e1b2c689e9179a980beaabe6.tar.gz
UXP-54091ecab46c93c2e1b2c689e9179a980beaabe6.tar.lz
UXP-54091ecab46c93c2e1b2c689e9179a980beaabe6.tar.xz
UXP-54091ecab46c93c2e1b2c689e9179a980beaabe6.zip
Forward to new tree structure.
Diffstat (limited to 'layout/generic')
-rw-r--r--layout/generic/BlockReflowInput.cpp2
-rw-r--r--layout/generic/StickyScrollContainer.cpp10
-rw-r--r--layout/generic/crashtests/crashtests.list2
-rw-r--r--layout/generic/nsColumnSetFrame.cpp19
-rw-r--r--layout/generic/nsFrame.cpp101
-rw-r--r--layout/generic/nsFrame.h3
-rw-r--r--layout/generic/nsGridContainerFrame.cpp851
-rw-r--r--layout/generic/nsIFrame.h31
-rw-r--r--layout/generic/nsInlineFrame.cpp55
-rw-r--r--layout/generic/nsInlineFrame.h7
-rw-r--r--layout/generic/nsTextFrame.cpp3
-rw-r--r--layout/generic/test/mochitest.ini4
-rw-r--r--layout/generic/test/test_grid_track_sizing_algo_001.html1641
-rw-r--r--layout/generic/test/test_grid_track_sizing_algo_002.html1641
14 files changed, 3796 insertions, 574 deletions
diff --git a/layout/generic/BlockReflowInput.cpp b/layout/generic/BlockReflowInput.cpp
index 10084fd8b..86248ac14 100644
--- a/layout/generic/BlockReflowInput.cpp
+++ b/layout/generic/BlockReflowInput.cpp
@@ -716,6 +716,8 @@ FloatMarginISize(const ReflowInput& aCBReflowInput,
bool
BlockReflowInput::FlowAndPlaceFloat(nsIFrame* aFloat)
{
+ MOZ_ASSERT(aFloat->GetParent() == mBlock);
+
WritingMode wm = mReflowInput.GetWritingMode();
// Save away the Y coordinate before placing the float. We will
// restore mBCoord at the end after placing the float. This is
diff --git a/layout/generic/StickyScrollContainer.cpp b/layout/generic/StickyScrollContainer.cpp
index ca68992c3..c5ed44e92 100644
--- a/layout/generic/StickyScrollContainer.cpp
+++ b/layout/generic/StickyScrollContainer.cpp
@@ -45,7 +45,7 @@ StickyScrollContainer::GetStickyScrollContainerForFrame(nsIFrame* aFrame)
// <html style="position: fixed">
return nullptr;
}
- auto frame = static_cast<nsIFrame*>(do_QueryFrame(scrollFrame));
+ nsIFrame* frame = do_QueryFrame(scrollFrame);
StickyScrollContainer* s =
frame->GetProperty(StickyScrollContainerProperty());
if (!s) {
@@ -176,6 +176,14 @@ StickyScrollContainer::ComputeStickyLimits(nsIFrame* aFrame, nsRect* aStick,
nsRect rect =
nsLayoutUtils::GetAllInFlowRectsUnion(aFrame, aFrame->GetParent());
+ // Note: Table row groups aren't supposed to be containing blocks, but we treat
+ // them as such anyway.
+ // Not having this basically disables position:sticky on table cells, which
+ // would be really unfortunate, and doesn't match what other browsers do.
+ if (cbFrame != scrolledFrame && cbFrame->GetType() == nsGkAtoms::tableRowGroupFrame) {
+ cbFrame = cbFrame->GetContainingBlock();
+ }
+
// Containing block limits for the position of aFrame relative to its parent.
// The margin box of the sticky element stays within the content box of the
// contaning-block element.
diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list
index e36a4742f..183556ab9 100644
--- a/layout/generic/crashtests/crashtests.list
+++ b/layout/generic/crashtests/crashtests.list
@@ -25,7 +25,7 @@ load 321224.xul
load 322780-1.xul
load 323381-1.html
load 323381-2.html
-asserts-if(gtkWidget,1) asserts-if(Android&&asyncPan,1) load 323386-1.html # Bug 718883
+asserts-if(gtkWidget,1) asserts-if(Android&&asyncPan,1) asserts-if(winWidget,1) load 323386-1.html # Bug 718883
load 323389-1.html
load 323389-2.html
load 323493-1.html
diff --git a/layout/generic/nsColumnSetFrame.cpp b/layout/generic/nsColumnSetFrame.cpp
index ad36ba1a8..6ea15d4d2 100644
--- a/layout/generic/nsColumnSetFrame.cpp
+++ b/layout/generic/nsColumnSetFrame.cpp
@@ -183,18 +183,15 @@ nsColumnSetFrame::GetAvailableContentBSize(const ReflowInput& aReflowInput)
static nscoord
GetColumnGap(nsColumnSetFrame* aFrame,
- const nsStyleColumn* aColStyle)
+ const nsStyleColumn* aColStyle,
+ nscoord aPercentageBasis)
{
- if (eStyleUnit_Normal == aColStyle->mColumnGap.GetUnit())
+ const auto& columnGap = aColStyle->mColumnGap;
+ if (columnGap.GetUnit() == eStyleUnit_Normal) {
return aFrame->StyleFont()->mFont.size;
- if (eStyleUnit_Coord == aColStyle->mColumnGap.GetUnit()) {
- nscoord colGap = aColStyle->mColumnGap.GetCoordValue();
- NS_ASSERTION(colGap >= 0, "negative column gap");
- return colGap;
}
- NS_NOTREACHED("Unknown gap type");
- return 0;
+ return nsLayoutUtils::ResolveGapToLength(columnGap, aPercentageBasis);
}
nsColumnSetFrame::ReflowConfig
@@ -227,7 +224,7 @@ nsColumnSetFrame::ChooseColumnStrategy(const ReflowInput& aReflowInput,
colBSize = std::min(colBSize, aReflowInput.ComputedMaxBSize());
}
- nscoord colGap = GetColumnGap(this, colStyle);
+ nscoord colGap = GetColumnGap(this, colStyle, aReflowInput.ComputedISize());
int32_t numColumns = colStyle->mColumnCount;
// If column-fill is set to 'balance', then we want to balance the columns.
@@ -403,7 +400,7 @@ nsColumnSetFrame::GetMinISize(nsRenderingContext *aRenderingContext)
// include n-1 column gaps.
colISize = iSize;
iSize *= colStyle->mColumnCount;
- nscoord colGap = GetColumnGap(this, colStyle);
+ nscoord colGap = GetColumnGap(this, colStyle, NS_UNCONSTRAINEDSIZE);
iSize += colGap * (colStyle->mColumnCount - 1);
// The multiplication above can make 'width' negative (integer overflow),
// so use std::max to protect against that.
@@ -424,7 +421,7 @@ nsColumnSetFrame::GetPrefISize(nsRenderingContext *aRenderingContext)
nscoord result = 0;
DISPLAY_PREF_WIDTH(this, result);
const nsStyleColumn* colStyle = StyleColumn();
- nscoord colGap = GetColumnGap(this, colStyle);
+ nscoord colGap = GetColumnGap(this, colStyle, NS_UNCONSTRAINEDSIZE);
nscoord colISize;
if (colStyle->mColumnWidth.GetUnit() == eStyleUnit_Coord) {
diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp
index bd96f213b..bbbb5c332 100644
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -562,15 +562,12 @@ nsFrame::Init(nsIContent* aContent,
}
if (disp->mPosition == NS_STYLE_POSITION_STICKY &&
!aPrevInFlow &&
- !(mState & NS_FRAME_IS_NONDISPLAY) &&
- !disp->IsInnerTableStyle()) {
+ !(mState & NS_FRAME_IS_NONDISPLAY)) {
// Note that we only add first continuations, but we really only
// want to add first continuation-or-ib-split-siblings. But since we
// don't yet know if we're a later part of a block-in-inline split,
// we'll just add later members of a block-in-inline split here, and
// then StickyScrollContainer will remove them later.
- // We don't currently support relative positioning of inner table
- // elements (bug 35168), so exclude them from sticky positioning too.
StickyScrollContainer* ssc =
StickyScrollContainer::GetStickyScrollContainerForFrame(this);
if (ssc) {
@@ -4515,68 +4512,44 @@ nsIFrame::InlinePrefISizeData::ForceBreak()
mSkipWhitespace = true;
}
-static void
-AddCoord(const nsStyleCoord& aStyle,
- nsIFrame* aFrame,
- nscoord* aCoord, float* aPercent,
- bool aClampNegativeToZero)
-{
- switch (aStyle.GetUnit()) {
- case eStyleUnit_Coord: {
- NS_ASSERTION(!aClampNegativeToZero || aStyle.GetCoordValue() >= 0,
- "unexpected negative value");
- *aCoord += aStyle.GetCoordValue();
- return;
- }
- case eStyleUnit_Percent: {
- NS_ASSERTION(!aClampNegativeToZero || aStyle.GetPercentValue() >= 0.0f,
- "unexpected negative value");
- *aPercent += aStyle.GetPercentValue();
- return;
- }
- case eStyleUnit_Calc: {
- const nsStyleCoord::Calc *calc = aStyle.GetCalcValue();
- if (aClampNegativeToZero) {
- // This is far from ideal when one is negative and one is positive.
- *aCoord += std::max(calc->mLength, 0);
- *aPercent += std::max(calc->mPercent, 0.0f);
- } else {
- *aCoord += calc->mLength;
- *aPercent += calc->mPercent;
- }
- return;
- }
- default: {
- return;
- }
+static nscoord
+ResolveMargin(const nsStyleCoord& aStyle, nscoord aPercentageBasis)
+{
+ if (aStyle.GetUnit() == eStyleUnit_Auto) {
+ return nscoord(0);
}
+ return nsLayoutUtils::ResolveToLength<false>(aStyle, aPercentageBasis);
+}
+
+static nscoord
+ResolvePadding(const nsStyleCoord& aStyle, nscoord aPercentageBasis)
+{
+ return nsLayoutUtils::ResolveToLength<true>(aStyle, aPercentageBasis);
}
static nsIFrame::IntrinsicISizeOffsetData
-IntrinsicSizeOffsets(nsIFrame* aFrame, bool aForISize)
+IntrinsicSizeOffsets(nsIFrame* aFrame, nscoord aPercentageBasis, bool aForISize)
{
nsIFrame::IntrinsicISizeOffsetData result;
WritingMode wm = aFrame->GetWritingMode();
- const nsStyleMargin* styleMargin = aFrame->StyleMargin();
+ const auto& margin = aFrame->StyleMargin()->mMargin;
bool verticalAxis = aForISize == wm.IsVertical();
- AddCoord(verticalAxis ? styleMargin->mMargin.GetTop()
- : styleMargin->mMargin.GetLeft(),
- aFrame, &result.hMargin, &result.hPctMargin,
- false);
- AddCoord(verticalAxis ? styleMargin->mMargin.GetBottom()
- : styleMargin->mMargin.GetRight(),
- aFrame, &result.hMargin, &result.hPctMargin,
- false);
-
- const nsStylePadding* stylePadding = aFrame->StylePadding();
- AddCoord(verticalAxis ? stylePadding->mPadding.GetTop()
- : stylePadding->mPadding.GetLeft(),
- aFrame, &result.hPadding, &result.hPctPadding,
- true);
- AddCoord(verticalAxis ? stylePadding->mPadding.GetBottom()
- : stylePadding->mPadding.GetRight(),
- aFrame, &result.hPadding, &result.hPctPadding,
- true);
+ if (verticalAxis) {
+ result.hMargin += ResolveMargin(margin.GetTop(), aPercentageBasis);
+ result.hMargin += ResolveMargin(margin.GetBottom(), aPercentageBasis);
+ } else {
+ result.hMargin += ResolveMargin(margin.GetLeft(), aPercentageBasis);
+ result.hMargin += ResolveMargin(margin.GetRight(), aPercentageBasis);
+ }
+
+ const auto& padding = aFrame->StylePadding()->mPadding;
+ if (verticalAxis) {
+ result.hPadding += ResolvePadding(padding.GetTop(), aPercentageBasis);
+ result.hPadding += ResolvePadding(padding.GetBottom(), aPercentageBasis);
+ } else {
+ result.hPadding += ResolvePadding(padding.GetLeft(), aPercentageBasis);
+ result.hPadding += ResolvePadding(padding.GetRight(), aPercentageBasis);
+ }
const nsStyleBorder* styleBorder = aFrame->StyleBorder();
if (verticalAxis) {
@@ -4606,22 +4579,21 @@ IntrinsicSizeOffsets(nsIFrame* aFrame, bool aForISize)
result.hPadding =
presContext->DevPixelsToAppUnits(verticalAxis ? padding.TopBottom()
: padding.LeftRight());
- result.hPctPadding = 0;
}
}
return result;
}
/* virtual */ nsIFrame::IntrinsicISizeOffsetData
-nsFrame::IntrinsicISizeOffsets()
+nsFrame::IntrinsicISizeOffsets(nscoord aPercentageBasis)
{
- return IntrinsicSizeOffsets(this, true);
+ return IntrinsicSizeOffsets(this, aPercentageBasis, true);
}
nsIFrame::IntrinsicISizeOffsetData
-nsIFrame::IntrinsicBSizeOffsets()
+nsIFrame::IntrinsicBSizeOffsets(nscoord aPercentageBasis)
{
- return IntrinsicSizeOffsets(this, false);
+ return IntrinsicSizeOffsets(this, aPercentageBasis, false);
}
/* virtual */ IntrinsicSize
@@ -6654,6 +6626,9 @@ GetNearestBlockContainer(nsIFrame* frame)
// Since the parent of such a block is either a normal block or
// another such pseudo, this shouldn't cause anything bad to happen.
// Also the anonymous blocks inside table cells are not containing blocks.
+ //
+ // If we ever start skipping table row groups from being containing blocks,
+ // we need to remove the containing block assignment in StickyScrollContainer .
while (frame->IsFrameOfType(nsIFrame::eLineParticipant) ||
frame->IsBlockWrapper() ||
// Table rows are not containing blocks either
diff --git a/layout/generic/nsFrame.h b/layout/generic/nsFrame.h
index af1c95ef2..439e39856 100644
--- a/layout/generic/nsFrame.h
+++ b/layout/generic/nsFrame.h
@@ -261,7 +261,8 @@ public:
InlineMinISizeData *aData) override;
virtual void AddInlinePrefISize(nsRenderingContext *aRenderingContext,
InlinePrefISizeData *aData) override;
- virtual IntrinsicISizeOffsetData IntrinsicISizeOffsets() override;
+ IntrinsicISizeOffsetData
+ IntrinsicISizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE) override;
virtual mozilla::IntrinsicSize GetIntrinsicSize() override;
virtual nsSize GetIntrinsicRatio() override;
diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp
index 3a2d5ad1d..959061e33 100644
--- a/layout/generic/nsGridContainerFrame.cpp
+++ b/layout/generic/nsGridContainerFrame.cpp
@@ -8,8 +8,8 @@
#include "nsGridContainerFrame.h"
-#include <algorithm> // for std::stable_sort
#include <limits>
+#include <stdlib.h> // for div()
#include "mozilla/CSSAlignUtils.h"
#include "mozilla/dom/GridBinding.h"
#include "mozilla/Function.h"
@@ -127,43 +127,6 @@ ResolveToDefiniteSize(const nsStyleCoord& aCoord, nscoord aPercentBasis)
nsRuleNode::ComputeCoordPercentCalc(aCoord, aPercentBasis));
}
-static bool
-GetPercentSizeParts(const nsStyleCoord& aCoord, nscoord* aLength, float* aPercent)
-{
- switch (aCoord.GetUnit()) {
- case eStyleUnit_Percent:
- *aLength = 0;
- *aPercent = aCoord.GetPercentValue();
- return true;
- case eStyleUnit_Calc: {
- nsStyleCoord::Calc* calc = aCoord.GetCalcValue();
- *aLength = calc->mLength;
- *aPercent = calc->mPercent;
- return true;
- }
- default:
- return false;
- }
-}
-
-static void
-ResolvePercentSizeParts(const nsStyleCoord& aCoord, nscoord aPercentBasis,
- nscoord* aLength, float* aPercent)
-{
- MOZ_ASSERT(aCoord.IsCoordPercentCalcUnit());
- if (aPercentBasis != NS_UNCONSTRAINEDSIZE) {
- *aLength = std::max(nscoord(0),
- nsRuleNode::ComputeCoordPercentCalc(aCoord,
- aPercentBasis));
- *aPercent = 0.0f;
- return;
- }
- if (!GetPercentSizeParts(aCoord, aLength, aPercent)) {
- *aLength = aCoord.ToLength();
- *aPercent = 0.0f;
- }
-}
-
// Synthesize a baseline from a border box. For an alphabetical baseline
// this is the end edge of the border box. For a central baseline it's
// the center of the border box.
@@ -198,7 +161,7 @@ struct nsGridContainerFrame::TrackSize
eMaxContentMinSizing = 0x4,
eMinOrMaxContentMinSizing = eMinContentMinSizing | eMaxContentMinSizing,
eIntrinsicMinSizing = eMinOrMaxContentMinSizing | eAutoMinSizing,
- // 0x8 is unused, feel free to take it!
+ eModified = 0x8,
eAutoMaxSizing = 0x10,
eMinContentMaxSizing = 0x20,
eMaxContentMaxSizing = 0x40,
@@ -211,6 +174,7 @@ struct nsGridContainerFrame::TrackSize
eSkipGrowUnlimited = eSkipGrowUnlimited1 | eSkipGrowUnlimited2,
eBreakBefore = 0x800,
eFitContent = 0x1000,
+ eInfinitelyGrowable = 0x2000,
};
StateBits Initialize(nscoord aPercentageBasis,
@@ -724,9 +688,6 @@ struct nsGridContainerFrame::LineRange
mEnd > mStart, "invalid line range");
mEnd -= aNumRemovedTracks[mEnd];
}
- if (mStart == mEnd) {
- mEnd = nsGridContainerFrame::kAutoLine;
- }
}
/**
* Return the contribution of this line range for step 2 in
@@ -856,6 +817,8 @@ struct nsGridContainerFrame::GridItemInfo
// Return true if we should apply Automatic Minimum Size to this item.
// https://drafts.csswg.org/css-grid/#min-size-auto
+ // @note the caller should also check that the item spans at least one track
+ // that has a min track sizing function that is 'auto' before applying it.
bool ShouldApplyAutoMinSize(WritingMode aContainerWM,
LogicalAxis aContainerAxis,
nscoord aPercentageBasis) const
@@ -915,6 +878,12 @@ nsGridContainerFrame::GridItemInfo::Dump() const
if (state & ItemState::eIsFlexing) {
printf("flexing ");
}
+ if (state & ItemState::eApplyAutoMinSize) {
+ printf("auto-min-size ");
+ }
+ if (state & ItemState::eClampMarginBoxMinSize) {
+ printf("clamp ");
+ }
if (state & ItemState::eFirstBaseline) {
printf("first baseline %s-alignment ",
(state & ItemState::eSelfBaseline) ? "self" : "content");
@@ -1091,6 +1060,7 @@ private:
const nsTArray<nsString>& mRepeatAutoLineNameListBefore;
const nsTArray<nsString>& mRepeatAutoLineNameListAfter;
// The index of the repeat(auto-fill/fit) track, or zero if there is none.
+ // Relative to mExplicitGridOffset (repeat tracks are explicit by definition).
const uint32_t mRepeatAutoStart;
// The (hypothetical) index of the last such repeat() track.
const uint32_t mRepeatAutoEnd;
@@ -1101,6 +1071,7 @@ private:
// generates one track (making mRepeatEndDelta == 0).
const uint32_t mTemplateLinesEnd;
// True if there is a specified repeat(auto-fill/fit) track.
+ // Indexed relative to mExplicitGridOffset + mRepeatAutoStart.
const bool mHasRepeatAuto;
};
@@ -1164,7 +1135,7 @@ struct nsGridContainerFrame::TrackSizingFunctions
return 1;
}
nscoord repeatTrackSize = 0;
- // Note that the repeat() track size is included in |sum| in this loop.
+ // Note that one repeat() track size is included in |sum| in this loop.
nscoord sum = 0;
const nscoord percentBasis = aSize;
for (uint32_t i = 0; i < numTracks; ++i) {
@@ -1181,54 +1152,31 @@ struct nsGridContainerFrame::TrackSizingFunctions
}
nscoord trackSize = ::ResolveToDefiniteSize(*coord, percentBasis);
if (i == mRepeatAutoStart) {
- if (percentBasis != NS_UNCONSTRAINEDSIZE) {
- // Use a minimum 1px for the repeat() track-size.
- if (trackSize < AppUnitsPerCSSPixel()) {
- trackSize = AppUnitsPerCSSPixel();
- }
+ // Use a minimum 1px for the repeat() track-size.
+ if (trackSize < AppUnitsPerCSSPixel()) {
+ trackSize = AppUnitsPerCSSPixel();
}
repeatTrackSize = trackSize;
}
sum += trackSize;
}
- nscoord gridGap;
- float percentSum = 0.0f;
- float gridGapPercent;
- ResolvePercentSizeParts(aGridGap, percentBasis, &gridGap, &gridGapPercent);
+ nscoord gridGap = nsLayoutUtils::ResolveGapToLength(aGridGap, aSize);
if (numTracks > 1) {
// Add grid-gaps for all the tracks including the repeat() track.
sum += gridGap * (numTracks - 1);
- percentSum = gridGapPercent * (numTracks - 1);
}
// Calculate the max number of tracks that fits without overflow.
nscoord available = maxFill != NS_UNCONSTRAINEDSIZE ? maxFill : aMinSize;
- nscoord size = nsLayoutUtils::AddPercents(sum, percentSum);
- if (available - size < 0) {
+ nscoord spaceToFill = available - sum;
+ if (spaceToFill <= 0) {
// "if any number of repetitions would overflow, then 1 repetition"
return 1;
}
- uint32_t numRepeatTracks = 1;
- bool exactFit = false;
- while (true) {
- sum += gridGap + repeatTrackSize;
- percentSum += gridGapPercent;
- nscoord newSize = nsLayoutUtils::AddPercents(sum, percentSum);
- if (newSize <= size) {
- // Adding more repeat-tracks won't make forward progress.
- return numRepeatTracks;
- }
- size = newSize;
- nscoord remaining = available - size;
- exactFit = remaining == 0;
- if (remaining >= 0) {
- ++numRepeatTracks;
- }
- if (remaining <= 0) {
- break;
- }
- }
-
- if (!exactFit && maxFill == NS_UNCONSTRAINEDSIZE) {
+ // Calculate the max number of tracks that fits without overflow.
+ div_t q = div(spaceToFill, repeatTrackSize + gridGap);
+ // The +1 here is for the one repeat track we already accounted for above.
+ uint32_t numRepeatTracks = q.quot + 1;
+ if (q.rem != 0 && maxFill == NS_UNCONSTRAINEDSIZE) {
// "Otherwise, if the grid container has a definite min size in
// the relevant axis, the number of repetitions is the largest possible
// positive integer that fulfills that minimum requirement."
@@ -1340,15 +1288,9 @@ struct nsGridContainerFrame::Tracks
nscoord aContentBoxSize);
/**
- * Return true if aRange spans at least one track with an intrinsic sizing
- * function and does not span any tracks with a <flex> max-sizing function.
- * @param aRange the span of tracks to check
- * @param aState will be set to the union of the state bits of all the spanned
- * tracks, unless a flex track is found - then it only contains
- * the union of the tracks up to and including the flex track.
+ * Return the union of the state bits for the tracks in aRange.
*/
- bool HasIntrinsicButNoFlexSizingInRange(const LineRange& aRange,
- TrackSize::StateBits* aState) const;
+ TrackSize::StateBits StateBitsForRange(const LineRange& aRange) const;
// Some data we collect for aligning baseline-aligned items.
struct ItemBaselineData
@@ -1383,6 +1325,62 @@ struct nsGridContainerFrame::Tracks
*/
void AlignBaselineSubtree(const GridItemInfo& aGridItem) const;
+ enum class TrackSizingPhase
+ {
+ eIntrinsicMinimums,
+ eContentBasedMinimums,
+ eMaxContentMinimums,
+ eIntrinsicMaximums,
+ eMaxContentMaximums,
+ };
+
+ // Some data we collect on each item for Step 2 of the Track Sizing Algorithm
+ // in ResolveIntrinsicSize below.
+ struct Step2ItemData final
+ {
+ uint32_t mSpan;
+ TrackSize::StateBits mState;
+ LineRange mLineRange;
+ nscoord mMinSize;
+ nscoord mMinContentContribution;
+ nscoord mMaxContentContribution;
+ nsIFrame* mFrame;
+ static bool IsSpanLessThan(const Step2ItemData& a, const Step2ItemData& b)
+ {
+ return a.mSpan < b.mSpan;
+ }
+
+ template<TrackSizingPhase phase>
+ nscoord SizeContributionForPhase() const
+ {
+ switch (phase) {
+ case TrackSizingPhase::eIntrinsicMinimums:
+ case TrackSizingPhase::eIntrinsicMaximums:
+ return mMinSize;
+ case TrackSizingPhase::eContentBasedMinimums:
+ return mMinContentContribution;
+ case TrackSizingPhase::eMaxContentMinimums:
+ case TrackSizingPhase::eMaxContentMaximums:
+ return mMaxContentContribution;
+ }
+ MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unexpected phase");
+ }
+ };
+
+ using FitContentClamper =
+ function<bool(uint32_t aTrack, nscoord aMinSize, nscoord* aSize)>;
+
+ // Helper method for ResolveIntrinsicSize.
+ template<TrackSizingPhase phase>
+ bool GrowSizeForSpanningItems(nsTArray<Step2ItemData>::iterator aIter,
+ const nsTArray<Step2ItemData>::iterator aEnd,
+ nsTArray<uint32_t>& aTracks,
+ nsTArray<TrackSize>& aPlan,
+ nsTArray<TrackSize>& aItemPlan,
+ TrackSize::StateBits aSelector,
+ const FitContentClamper& aClamper = nullptr,
+ bool aNeedInfinitelyGrowableFlag = false);
+
/**
* Resolve Intrinsic Track Sizes.
* http://dev.w3.org/csswg/css-grid/#algo-content
@@ -1405,66 +1403,117 @@ struct nsGridContainerFrame::Tracks
SizingConstraint aConstraint,
const LineRange& aRange,
const GridItemInfo& aGridItem);
+
+ // Helper method that returns the track size to use in §11.5.1.2
+ // https://drafts.csswg.org/css-grid/#extra-space
+ template<TrackSizingPhase phase> static
+ nscoord StartSizeInDistribution(const TrackSize& aSize)
+ {
+ switch (phase) {
+ case TrackSizingPhase::eIntrinsicMinimums:
+ case TrackSizingPhase::eContentBasedMinimums:
+ case TrackSizingPhase::eMaxContentMinimums:
+ return aSize.mBase;
+ case TrackSizingPhase::eIntrinsicMaximums:
+ case TrackSizingPhase::eMaxContentMaximums:
+ if (aSize.mLimit == NS_UNCONSTRAINEDSIZE) {
+ return aSize.mBase;
+ }
+ return aSize.mLimit;
+ }
+ MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unexpected phase");
+ }
+
/**
* Collect the tracks which are growable (matching aSelector) into
* aGrowableTracks, and return the amount of space that can be used
- * to grow those tracks. Specifically, we return aAvailableSpace minus
- * the sum of mBase's (and corresponding grid gaps) in aPlan (clamped to 0)
- * for the tracks in aRange, or zero when there are no growable tracks.
- * @note aPlan[*].mBase represents a planned new base or limit.
+ * to grow those tracks. This method implements CSS Grid §11.5.1.2.
+ * https://drafts.csswg.org/css-grid/#extra-space
*/
- nscoord CollectGrowable(nscoord aAvailableSpace,
- const nsTArray<TrackSize>& aPlan,
- const LineRange& aRange,
- TrackSize::StateBits aSelector,
- nsTArray<uint32_t>& aGrowableTracks) const
+ template<TrackSizingPhase phase>
+ nscoord CollectGrowable(nscoord aAvailableSpace,
+ const LineRange& aRange,
+ TrackSize::StateBits aSelector,
+ nsTArray<uint32_t>& aGrowableTracks) const
{
MOZ_ASSERT(aAvailableSpace > 0, "why call me?");
nscoord space = aAvailableSpace - mGridGap * (aRange.Extent() - 1);
const uint32_t start = aRange.mStart;
const uint32_t end = aRange.mEnd;
for (uint32_t i = start; i < end; ++i) {
- const TrackSize& sz = aPlan[i];
- space -= sz.mBase;
+ const TrackSize& sz = mSizes[i];
+ space -= StartSizeInDistribution<phase>(sz);
if (space <= 0) {
return 0;
}
- if ((sz.mState & aSelector) && !sz.IsFrozen()) {
+ if (sz.mState & aSelector) {
aGrowableTracks.AppendElement(i);
}
}
return aGrowableTracks.IsEmpty() ? 0 : space;
}
- void SetupGrowthPlan(nsTArray<TrackSize>& aPlan,
- const nsTArray<uint32_t>& aTracks) const
+ template<TrackSizingPhase phase>
+ void InitializeItemPlan(nsTArray<TrackSize>& aItemPlan,
+ const nsTArray<uint32_t>& aTracks) const
{
for (uint32_t track : aTracks) {
- aPlan[track] = mSizes[track];
+ auto& plan = aItemPlan[track];
+ const TrackSize& sz = mSizes[track];
+ plan.mBase = StartSizeInDistribution<phase>(sz);
+ bool unlimited = sz.mState & TrackSize::eInfinitelyGrowable;
+ plan.mLimit = unlimited ? NS_UNCONSTRAINEDSIZE : sz.mLimit;
+ plan.mState = sz.mState;
}
}
- void CopyPlanToBase(const nsTArray<TrackSize>& aPlan,
- const nsTArray<uint32_t>& aTracks)
+ template<TrackSizingPhase phase>
+ void InitializePlan(nsTArray<TrackSize>& aPlan) const
{
- for (uint32_t track : aTracks) {
- MOZ_ASSERT(mSizes[track].mBase <= aPlan[track].mBase);
- mSizes[track].mBase = aPlan[track].mBase;
+ for (size_t i = 0, len = aPlan.Length(); i < len; ++i) {
+ auto& plan = aPlan[i];
+ const auto& sz = mSizes[i];
+ plan.mBase = StartSizeInDistribution<phase>(sz);
+ MOZ_ASSERT(phase == TrackSizingPhase::eMaxContentMaximums ||
+ !(sz.mState & TrackSize::eInfinitelyGrowable),
+ "forgot to reset the eInfinitelyGrowable bit?");
+ plan.mState = sz.mState;
}
}
- void CopyPlanToLimit(const nsTArray<TrackSize>& aPlan,
- const nsTArray<uint32_t>& aTracks)
+ template<TrackSizingPhase phase>
+ void CopyPlanToSize(const nsTArray<TrackSize>& aPlan,
+ bool aNeedInfinitelyGrowableFlag = false)
{
- for (uint32_t track : aTracks) {
- MOZ_ASSERT(mSizes[track].mLimit == NS_UNCONSTRAINEDSIZE ||
- mSizes[track].mLimit <= aPlan[track].mBase);
- mSizes[track].mLimit = aPlan[track].mBase;
+ for (size_t i = 0, len = mSizes.Length(); i < len; ++i) {
+ const auto& plan = aPlan[i];
+ MOZ_ASSERT(plan.mBase >= 0);
+ auto& sz = mSizes[i];
+ switch (phase) {
+ case TrackSizingPhase::eIntrinsicMinimums:
+ case TrackSizingPhase::eContentBasedMinimums:
+ case TrackSizingPhase::eMaxContentMinimums:
+ sz.mBase = plan.mBase;
+ break;
+ case TrackSizingPhase::eIntrinsicMaximums:
+ if (plan.mState & TrackSize::eModified) {
+ if (sz.mLimit == NS_UNCONSTRAINEDSIZE &&
+ aNeedInfinitelyGrowableFlag) {
+ sz.mState |= TrackSize::eInfinitelyGrowable;
+ }
+ sz.mLimit = plan.mBase;
+ }
+ break;
+ case TrackSizingPhase::eMaxContentMaximums:
+ if (plan.mState & TrackSize::eModified) {
+ sz.mLimit = plan.mBase;
+ }
+ sz.mState &= ~TrackSize::eInfinitelyGrowable;
+ break;
+ }
}
}
- using FitContentClamper =
- function<bool(uint32_t aTrack, nscoord aMinSize, nscoord* aSize)>;
/**
* Grow the planned size for tracks in aGrowableTracks up to their limit
* and then freeze them (all aGrowableTracks must be unfrozen on entry).
@@ -1524,12 +1573,13 @@ struct nsGridContainerFrame::Tracks
* assumed that aPlan have no aSkipFlag set for tracks in aGrowableTracks
* on entry to this method.
*/
- uint32_t MarkExcludedTracks(nsTArray<TrackSize>& aPlan,
- uint32_t aNumGrowable,
- const nsTArray<uint32_t>& aGrowableTracks,
- TrackSize::StateBits aMinSizingSelector,
- TrackSize::StateBits aMaxSizingSelector,
- TrackSize::StateBits aSkipFlag) const
+ static uint32_t
+ MarkExcludedTracks(nsTArray<TrackSize>& aPlan,
+ uint32_t aNumGrowable,
+ const nsTArray<uint32_t>& aGrowableTracks,
+ TrackSize::StateBits aMinSizingSelector,
+ TrackSize::StateBits aMaxSizingSelector,
+ TrackSize::StateBits aSkipFlag)
{
bool foundOneSelected = false;
bool foundOneGrowable = false;
@@ -1559,41 +1609,60 @@ struct nsGridContainerFrame::Tracks
}
/**
- * Increase the planned size for tracks in aGrowableTracks that match
- * aSelector (or all tracks if aSelector is zero) beyond their limit.
+ * Mark all tracks in aGrowableTracks with an eSkipGrowUnlimited bit if
+ * they *shouldn't* grow unlimited in §11.5.1.2.3 "Distribute space beyond
+ * growth limits" https://drafts.csswg.org/css-grid/#extra-space
+ * Return the number of tracks that are still growable.
+ */
+ template<TrackSizingPhase phase>
+ static uint32_t
+ MarkExcludedTracks(nsTArray<TrackSize>& aPlan,
+ const nsTArray<uint32_t>& aGrowableTracks,
+ TrackSize::StateBits aSelector)
+ {
+ uint32_t numGrowable = aGrowableTracks.Length();
+ if (phase == TrackSizingPhase::eIntrinsicMaximums ||
+ phase == TrackSizingPhase::eMaxContentMaximums) {
+ // "when handling any intrinsic growth limit: all affected tracks"
+ return numGrowable;
+ }
+ MOZ_ASSERT(aSelector == (aSelector & TrackSize::eIntrinsicMinSizing) &&
+ (aSelector & TrackSize::eMaxContentMinSizing),
+ "Should only get here for track sizing steps 2.1 to 2.3");
+ // Note that eMaxContentMinSizing is always included. We do those first:
+ numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks,
+ TrackSize::eMaxContentMinSizing,
+ TrackSize::eMaxContentMaxSizing,
+ TrackSize::eSkipGrowUnlimited1);
+ // Now mark min-content/auto min-sizing tracks if requested.
+ auto minOrAutoSelector = aSelector & ~TrackSize::eMaxContentMinSizing;
+ if (minOrAutoSelector) {
+ numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks,
+ minOrAutoSelector,
+ TrackSize::eIntrinsicMaxSizing,
+ TrackSize::eSkipGrowUnlimited2);
+ }
+ return numGrowable;
+ }
+
+ /**
+ * Increase the planned size for tracks in aGrowableTracks that aren't
+ * marked with a eSkipGrowUnlimited flag beyond their limit.
* This implements the "Distribute space beyond growth limits" step in
* https://drafts.csswg.org/css-grid/#distribute-extra-space
*/
void GrowSelectedTracksUnlimited(nscoord aAvailableSpace,
nsTArray<TrackSize>& aPlan,
const nsTArray<uint32_t>& aGrowableTracks,
- TrackSize::StateBits aSelector,
+ uint32_t aNumGrowable,
FitContentClamper aFitContentClamper) const
{
- MOZ_ASSERT(aAvailableSpace > 0 && aGrowableTracks.Length() > 0);
- uint32_t numGrowable = aGrowableTracks.Length();
- if (aSelector) {
- MOZ_ASSERT(aSelector == (aSelector & TrackSize::eIntrinsicMinSizing) &&
- (aSelector & TrackSize::eMaxContentMinSizing),
- "Should only get here for track sizing steps 2.1 to 2.3");
- // Note that eMaxContentMinSizing is always included. We do those first:
- numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks,
- TrackSize::eMaxContentMinSizing,
- TrackSize::eMaxContentMaxSizing,
- TrackSize::eSkipGrowUnlimited1);
- // Now mark min-content/auto min-sizing tracks if requested.
- auto minOrAutoSelector = aSelector & ~TrackSize::eMaxContentMinSizing;
- if (minOrAutoSelector) {
- numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks,
- minOrAutoSelector,
- TrackSize::eIntrinsicMaxSizing,
- TrackSize::eSkipGrowUnlimited2);
- }
- }
+ MOZ_ASSERT(aAvailableSpace > 0 && aGrowableTracks.Length() > 0 &&
+ aNumGrowable <= aGrowableTracks.Length());
nscoord space = aAvailableSpace;
DebugOnly<bool> didClamp = false;
- while (numGrowable) {
- nscoord spacePerTrack = std::max<nscoord>(space / numGrowable, 1);
+ while (aNumGrowable) {
+ nscoord spacePerTrack = std::max<nscoord>(space / aNumGrowable, 1);
for (uint32_t track : aGrowableTracks) {
TrackSize& sz = aPlan[track];
if (sz.mState & TrackSize::eSkipGrowUnlimited) {
@@ -1609,7 +1678,7 @@ struct nsGridContainerFrame::Tracks
delta = newBase - sz.mBase;
MOZ_ASSERT(delta >= 0, "track size shouldn't shrink");
sz.mState |= TrackSize::eSkipGrowUnlimited1;
- --numGrowable;
+ --aNumGrowable;
}
}
sz.mBase = newBase;
@@ -1628,46 +1697,30 @@ struct nsGridContainerFrame::Tracks
* Distribute aAvailableSpace to the planned base size for aGrowableTracks
* up to their limits, then distribute the remaining space beyond the limits.
*/
- void DistributeToTrackBases(nscoord aAvailableSpace,
+ template<TrackSizingPhase phase>
+ void DistributeToTrackSizes(nscoord aAvailableSpace,
nsTArray<TrackSize>& aPlan,
+ nsTArray<TrackSize>& aItemPlan,
nsTArray<uint32_t>& aGrowableTracks,
- TrackSize::StateBits aSelector)
+ TrackSize::StateBits aSelector,
+ const FitContentClamper& aFitContentClamper)
{
- SetupGrowthPlan(aPlan, aGrowableTracks);
- nscoord space = GrowTracksToLimit(aAvailableSpace, aPlan, aGrowableTracks, nullptr);
+ InitializeItemPlan<phase>(aItemPlan, aGrowableTracks);
+ nscoord space = GrowTracksToLimit(aAvailableSpace, aItemPlan, aGrowableTracks,
+ aFitContentClamper);
if (space > 0) {
- GrowSelectedTracksUnlimited(space, aPlan, aGrowableTracks, aSelector, nullptr);
+ uint32_t numGrowable =
+ MarkExcludedTracks<phase>(aItemPlan, aGrowableTracks, aSelector);
+ GrowSelectedTracksUnlimited(space, aItemPlan, aGrowableTracks,
+ numGrowable, aFitContentClamper);
}
- CopyPlanToBase(aPlan, aGrowableTracks);
- }
-
- /**
- * Distribute aAvailableSpace to the planned limits for aGrowableTracks.
- */
- void DistributeToTrackLimits(nscoord aAvailableSpace,
- nsTArray<TrackSize>& aPlan,
- nsTArray<uint32_t>& aGrowableTracks,
- const TrackSizingFunctions& aFunctions,
- nscoord aPercentageBasis)
- {
- auto fitContentClamper = [&aFunctions, aPercentageBasis] (uint32_t aTrack,
- nscoord aMinSize,
- nscoord* aSize) {
- nscoord fitContentLimit =
- ::ResolveToDefiniteSize(aFunctions.MaxSizingFor(aTrack), aPercentageBasis);
- if (*aSize > fitContentLimit) {
- *aSize = std::max(aMinSize, fitContentLimit);
- return true;
+ for (uint32_t track : aGrowableTracks) {
+ nscoord& plannedSize = aPlan[track].mBase;
+ nscoord itemIncurredSize = aItemPlan[track].mBase;
+ if (plannedSize < itemIncurredSize) {
+ plannedSize = itemIncurredSize;
}
- return false;
- };
- nscoord space = GrowTracksToLimit(aAvailableSpace, aPlan, aGrowableTracks,
- fitContentClamper);
- if (space > 0) {
- GrowSelectedTracksUnlimited(aAvailableSpace, aPlan, aGrowableTracks,
- TrackSize::StateBits(0), fitContentClamper);
}
- CopyPlanToLimit(aPlan, aGrowableTracks);
}
/**
@@ -1769,13 +1822,6 @@ struct nsGridContainerFrame::Tracks
WritingMode aWM,
const LogicalSize& aContainerSize);
- /**
- * Return the intrinsic size by back-computing percentages as:
- * IntrinsicSize = SumOfCoordSizes / (1 - SumOfPercentages).
- */
- nscoord BackComputedIntrinsicSize(const TrackSizingFunctions& aFunctions,
- const nsStyleCoord& aGridGap) const;
-
nscoord GridLineEdge(uint32_t aLine, GridLineSide aSide) const
{
if (MOZ_UNLIKELY(mSizes.IsEmpty())) {
@@ -2085,11 +2131,10 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::GridReflowInput
}
/**
- * Calculate our track sizes. If the given aContentBox block-axis size is
- * unconstrained, it is assigned to the resulting intrinsic block-axis size.
+ * Calculate our track sizes.
*/
void CalculateTrackSizes(const Grid& aGrid,
- LogicalSize& aContentBox,
+ const LogicalSize& aContentBox,
SizingConstraint aConstraint);
/**
@@ -2575,7 +2620,7 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::Grid
void
nsGridContainerFrame::GridReflowInput::CalculateTrackSizes(
const Grid& aGrid,
- LogicalSize& aContentBox,
+ const LogicalSize& aContentBox,
SizingConstraint aConstraint)
{
mCols.Initialize(mColFunctions, mGridStyle->mGridColumnGap,
@@ -2593,12 +2638,6 @@ nsGridContainerFrame::GridReflowInput::CalculateTrackSizes(
mRows.CalculateSizes(*this, mGridItems, mRowFunctions,
aContentBox.BSize(mWM), &GridArea::mRows,
aConstraint);
- if (aContentBox.BSize(mWM) == NS_AUTOHEIGHT) {
- aContentBox.BSize(mWM) =
- mRows.BackComputedIntrinsicSize(mRowFunctions, mGridStyle->mGridRowGap);
- mRows.mGridGap =
- ::ResolveToDefiniteSize(mGridStyle->mGridRowGap, aContentBox.BSize(mWM));
- }
}
/**
@@ -3545,19 +3584,27 @@ nsGridContainerFrame::Grid::PlaceGridItems(GridReflowInput& aState,
// Count empty 'auto-fit' tracks in the repeat() range.
// |colAdjust| will have a count for each line in the grid of how many
// tracks were empty between the start of the grid and that line.
+
+ // Since this loop is concerned with just the repeat tracks, we
+ // iterate from 0..NumRepeatTracks() which is the natural range of
+ // mRemoveRepeatTracks. This means we have to add
+ // (mExplicitGridOffset + mRepeatAutoStart) to get a zero-based
+ // index for arrays like mCellMap and colAdjust. We'll then fill out
+ // the colAdjust array for all the remaining lines.
Maybe<nsTArray<uint32_t>> colAdjust;
uint32_t numEmptyCols = 0;
if (aState.mColFunctions.mHasRepeatAuto &&
!gridStyle->mGridTemplateColumns.mIsAutoFill &&
aState.mColFunctions.NumRepeatTracks() > 0) {
- for (uint32_t col = aState.mColFunctions.mRepeatAutoStart,
- endRepeat = aState.mColFunctions.mRepeatAutoEnd,
- numColLines = mGridColEnd + 1;
- col < numColLines; ++col) {
+ const uint32_t repeatStart = (aState.mColFunctions.mExplicitGridOffset +
+ aState.mColFunctions.mRepeatAutoStart);
+ const uint32_t numRepeats = aState.mColFunctions.NumRepeatTracks();
+ const uint32_t numColLines = mGridColEnd + 1;
+ for (uint32_t i = 0; i < numRepeats; ++i) {
if (numEmptyCols) {
- (*colAdjust)[col] = numEmptyCols;
+ (*colAdjust)[repeatStart + i] = numEmptyCols;
}
- if (col < endRepeat && mCellMap.IsEmptyCol(col)) {
+ if (mCellMap.IsEmptyCol(repeatStart + i)) {
++numEmptyCols;
if (colAdjust.isNothing()) {
colAdjust.emplace(numColLines);
@@ -3565,26 +3612,34 @@ nsGridContainerFrame::Grid::PlaceGridItems(GridReflowInput& aState,
PodZero(colAdjust->Elements(), colAdjust->Length());
}
- uint32_t repeatIndex = col - aState.mColFunctions.mRepeatAutoStart;
- MOZ_ASSERT(aState.mColFunctions.mRemovedRepeatTracks.Length() >
- repeatIndex);
- aState.mColFunctions.mRemovedRepeatTracks[repeatIndex] = true;
+ aState.mColFunctions.mRemovedRepeatTracks[i] = true;
+ }
+ }
+ // Fill out the colAdjust array for all the columns after the
+ // repeats.
+ if (numEmptyCols) {
+ for (uint32_t col = repeatStart + numRepeats;
+ col < numColLines; ++col) {
+ (*colAdjust)[col] = numEmptyCols;
}
}
}
+
+ // Do similar work for the row tracks, with the same logic.
Maybe<nsTArray<uint32_t>> rowAdjust;
uint32_t numEmptyRows = 0;
if (aState.mRowFunctions.mHasRepeatAuto &&
!gridStyle->mGridTemplateRows.mIsAutoFill &&
aState.mRowFunctions.NumRepeatTracks() > 0) {
- for (uint32_t row = aState.mRowFunctions.mRepeatAutoStart,
- endRepeat = aState.mRowFunctions.mRepeatAutoEnd,
- numRowLines = mGridRowEnd + 1;
- row < numRowLines; ++row) {
+ const uint32_t repeatStart = (aState.mRowFunctions.mExplicitGridOffset +
+ aState.mRowFunctions.mRepeatAutoStart);
+ const uint32_t numRepeats = aState.mRowFunctions.NumRepeatTracks();
+ const uint32_t numRowLines = mGridRowEnd + 1;
+ for (uint32_t i = 0; i < numRepeats; ++i) {
if (numEmptyRows) {
- (*rowAdjust)[row] = numEmptyRows;
+ (*rowAdjust)[repeatStart + i] = numEmptyRows;
}
- if (row < endRepeat && mCellMap.IsEmptyRow(row)) {
+ if (mCellMap.IsEmptyRow(repeatStart + i)) {
++numEmptyRows;
if (rowAdjust.isNothing()) {
rowAdjust.emplace(numRowLines);
@@ -3592,10 +3647,13 @@ nsGridContainerFrame::Grid::PlaceGridItems(GridReflowInput& aState,
PodZero(rowAdjust->Elements(), rowAdjust->Length());
}
- uint32_t repeatIndex = row - aState.mRowFunctions.mRepeatAutoStart;
- MOZ_ASSERT(aState.mRowFunctions.mRemovedRepeatTracks.Length() >
- repeatIndex);
- aState.mRowFunctions.mRemovedRepeatTracks[repeatIndex] = true;
+ aState.mRowFunctions.mRemovedRepeatTracks[i] = true;
+ }
+ }
+ if (numEmptyRows) {
+ for (uint32_t row = repeatStart + numRepeats;
+ row < numRowLines; ++row) {
+ (*rowAdjust)[row] = numEmptyRows;
}
}
}
@@ -3681,7 +3739,7 @@ nsGridContainerFrame::Tracks::Initialize(
aFunctions.MinSizingFor(i),
aFunctions.MaxSizingFor(i));
}
- mGridGap = ::ResolveToDefiniteSize(aGridGap, aContentBoxSize);
+ mGridGap = nsLayoutUtils::ResolveGapToLength(aGridGap, aContentBoxSize);
mContentBoxSize = aContentBoxSize;
}
@@ -3762,8 +3820,7 @@ ContentContribution(const GridItemInfo& aGridItem,
PhysicalAxis axis(aCBWM.PhysicalAxis(aAxis));
nscoord size = nsLayoutUtils::IntrinsicForAxis(axis, aRC, child, aConstraint,
aPercentageBasis,
- aFlags | nsLayoutUtils::BAIL_IF_REFLOW_NEEDED |
- nsLayoutUtils::ADD_PERCENTS,
+ aFlags | nsLayoutUtils::BAIL_IF_REFLOW_NEEDED,
aMinSizeClamp);
if (size == NS_INTRINSIC_WIDTH_UNKNOWN) {
// We need to reflow the child to find its BSize contribution.
@@ -3800,15 +3857,7 @@ ContentContribution(const GridItemInfo& aGridItem,
LogicalSize availableSize(childWM, availISize, availBSize);
size = ::MeasuringReflow(child, aState.mReflowInput, aRC, availableSize,
cbSize, iMinSizeClamp, bMinSizeClamp);
- nsIFrame::IntrinsicISizeOffsetData offsets = child->IntrinsicBSizeOffsets();
- size += offsets.hMargin;
- auto percent = offsets.hPctMargin;
- if (availBSize == NS_UNCONSTRAINEDSIZE) {
- // We always want to add in percent padding too, unless we already did so
- // using a resolved column size above.
- percent += offsets.hPctPadding;
- }
- size = nsLayoutUtils::AddPercents(size, percent);
+ size += child->GetLogicalUsedMargin(childWM).BStartEnd(childWM);
nscoord overflow = size - aMinSizeClamp;
if (MOZ_UNLIKELY(overflow > 0)) {
nscoord contentSize = child->ContentBSize(childWM);
@@ -3913,6 +3962,10 @@ MinSize(const GridItemInfo& aGridItem,
return s;
}
+ if (aCache->mPercentageBasis.isNothing()) {
+ aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem));
+ }
+
// https://drafts.csswg.org/css-grid/#min-size-auto
// This calculates the min-content contribution from either a definite
// min-width (or min-height depending on aAxis), or the "specified /
@@ -3926,7 +3979,8 @@ MinSize(const GridItemInfo& aGridItem,
"baseline offset should be zero when not baseline-aligned");
nscoord sz = aGridItem.mBaselineOffset[aAxis] +
nsLayoutUtils::MinSizeContributionForAxis(axis, aRC, child,
- nsLayoutUtils::MIN_ISIZE);
+ nsLayoutUtils::MIN_ISIZE,
+ *aCache->mPercentageBasis);
const nsStyleCoord& style = axis == eAxisHorizontal ? stylePos->mMinWidth
: stylePos->mMinHeight;
auto unit = style.GetUnit();
@@ -3935,9 +3989,6 @@ MinSize(const GridItemInfo& aGridItem,
child->StyleDisplay()->mOverflowX == NS_STYLE_OVERFLOW_VISIBLE)) {
// Now calculate the "content size" part and return whichever is smaller.
MOZ_ASSERT(unit != eStyleUnit_Enumerated || sz == NS_UNCONSTRAINEDSIZE);
- if (aCache->mPercentageBasis.isNothing()) {
- aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem));
- }
sz = std::min(sz, ContentContribution(aGridItem, aState, aRC, aCBWM, aAxis,
aCache->mPercentageBasis,
nsLayoutUtils::MIN_ISIZE,
@@ -3974,28 +4025,16 @@ nsGridContainerFrame::Tracks::CalculateSizes(
}
}
-bool
-nsGridContainerFrame::Tracks::HasIntrinsicButNoFlexSizingInRange(
- const LineRange& aRange,
- TrackSize::StateBits* aState) const
+TrackSize::StateBits
+nsGridContainerFrame::Tracks::StateBitsForRange(const LineRange& aRange) const
{
- MOZ_ASSERT(!aRange.IsAuto(), "must have a definite range");
+ TrackSize::StateBits state = TrackSize::StateBits(0);
const uint32_t start = aRange.mStart;
const uint32_t end = aRange.mEnd;
- const TrackSize::StateBits selector =
- TrackSize::eIntrinsicMinSizing | TrackSize::eIntrinsicMaxSizing;
- bool foundIntrinsic = false;
for (uint32_t i = start; i < end; ++i) {
- TrackSize::StateBits state = mSizes[i].mState;
- *aState |= state;
- if (state & TrackSize::eFlexMaxSizing) {
- return false;
- }
- if (state & selector) {
- foundIntrinsic = true;
- }
+ state |= mSizes[i].mState;
}
- return foundIntrinsic;
+ return state;
}
bool
@@ -4010,6 +4049,13 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSizeStep1(
CachedIntrinsicSizes cache;
TrackSize& sz = mSizes[aRange.mStart];
WritingMode wm = aState.mWM;
+
+ // Check if we need to apply "Automatic Minimum Size" and cache it.
+ if ((sz.mState & TrackSize::eAutoMinSizing) &&
+ aGridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) {
+ aGridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize;
+ }
+
// Calculate data for "Automatic Minimum Size" clamping, if needed.
bool needed = ((sz.mState & TrackSize::eIntrinsicMinSizing) ||
aConstraint == SizingConstraint::eNoConstraint) &&
@@ -4370,6 +4416,55 @@ nsGridContainerFrame::Tracks::AlignBaselineSubtree(
}
}
+template<nsGridContainerFrame::Tracks::TrackSizingPhase phase>
+bool
+nsGridContainerFrame::Tracks::GrowSizeForSpanningItems(
+ nsTArray<Step2ItemData>::iterator aIter,
+ const nsTArray<Step2ItemData>::iterator aIterEnd,
+ nsTArray<uint32_t>& aTracks,
+ nsTArray<TrackSize>& aPlan,
+ nsTArray<TrackSize>& aItemPlan,
+ TrackSize::StateBits aSelector,
+ const FitContentClamper& aFitContentClamper,
+ bool aNeedInfinitelyGrowableFlag)
+{
+ constexpr bool isMaxSizingPhase =
+ phase == TrackSizingPhase::eIntrinsicMaximums ||
+ phase == TrackSizingPhase::eMaxContentMaximums;
+ bool needToUpdateSizes = false;
+ InitializePlan<phase>(aPlan);
+ for (; aIter != aIterEnd; ++aIter) {
+ const Step2ItemData& item = *aIter;
+ if (!(item.mState & aSelector)) {
+ continue;
+ }
+ if (isMaxSizingPhase) {
+ for (auto j = item.mLineRange.mStart, end = item.mLineRange.mEnd; j < end; ++j) {
+ aPlan[j].mState |= TrackSize::eModified;
+ }
+ }
+ nscoord space = item.SizeContributionForPhase<phase>();
+ if (space <= 0) {
+ continue;
+ }
+ aTracks.ClearAndRetainStorage();
+ space = CollectGrowable<phase>(space, item.mLineRange, aSelector,
+ aTracks);
+ if (space > 0) {
+ DistributeToTrackSizes<phase>(space, aPlan, aItemPlan, aTracks, aSelector,
+ aFitContentClamper);
+ needToUpdateSizes = true;
+ }
+ }
+ if (isMaxSizingPhase) {
+ needToUpdateSizes = true;
+ }
+ if (needToUpdateSizes) {
+ CopyPlanToSize<phase>(aPlan, aNeedInfinitelyGrowableFlag);
+ }
+ return needToUpdateSizes;
+}
+
void
nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
GridReflowInput& aState,
@@ -4379,21 +4474,6 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
nscoord aPercentageBasis,
SizingConstraint aConstraint)
{
- // Some data we collect on each item for Step 2 of the algorithm below.
- struct Step2ItemData
- {
- uint32_t mSpan;
- TrackSize::StateBits mState;
- LineRange mLineRange;
- nscoord mMinSize;
- nscoord mMinContentContribution;
- nscoord mMaxContentContribution;
- nsIFrame* mFrame;
- static bool IsSpanLessThan(const Step2ItemData& a, const Step2ItemData& b)
- {
- return a.mSpan < b.mSpan;
- }
- };
// Resolve Intrinsic Track Sizes
// http://dev.w3.org/csswg/css-grid/#algo-content
@@ -4418,12 +4498,10 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
for (; !iter.AtEnd(); iter.Next()) {
auto& gridItem = aGridItems[iter.GridItemIndex()];
- // Check if we need to apply "Automatic Minimum Size" and cache it.
- MOZ_ASSERT(!(gridItem.mState[mAxis] & ItemState::eApplyAutoMinSize),
- "Why is eApplyAutoMinSize set already?");
- if (gridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) {
- gridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize;
- }
+ MOZ_ASSERT(!(gridItem.mState[mAxis] &
+ (ItemState::eApplyAutoMinSize | ItemState::eIsFlexing |
+ ItemState::eClampMarginBoxMinSize)),
+ "Why are any of these bits set already?");
const GridArea& area = gridItem.mArea;
const LineRange& lineRange = area.*aRange;
@@ -4435,8 +4513,17 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
gridItem.mState[mAxis] |= ItemState::eIsFlexing;
}
} else {
- TrackSize::StateBits state = TrackSize::StateBits(0);
- if (HasIntrinsicButNoFlexSizingInRange(lineRange, &state)) {
+ TrackSize::StateBits state = StateBitsForRange(lineRange);
+
+ // Check if we need to apply "Automatic Minimum Size" and cache it.
+ if ((state & TrackSize::eAutoMinSizing) &&
+ gridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) {
+ gridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize;
+ }
+
+ if ((state & (TrackSize::eIntrinsicMinSizing |
+ TrackSize::eIntrinsicMaxSizing)) &&
+ !(state & TrackSize::eFlexMaxSizing)) {
// Collect data for Step 2.
maxSpan = std::max(maxSpan, span);
if (span >= stateBitsPerSpan.Length()) {
@@ -4500,6 +4587,18 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
// Step 2.
if (maxSpan) {
+ auto fitContentClamper = [&aFunctions, aPercentageBasis] (uint32_t aTrack,
+ nscoord aMinSize,
+ nscoord* aSize)
+ {
+ nscoord fitContentLimit =
+ ::ResolveToDefiniteSize(aFunctions.MaxSizingFor(aTrack), aPercentageBasis);
+ if (*aSize > fitContentLimit) {
+ *aSize = std::max(aMinSize, fitContentLimit);
+ return true;
+ }
+ return false;
+ };
// Sort the collected items on span length, shortest first.
std::stable_sort(step2Items.begin(), step2Items.end(),
Step2ItemData::IsSpanLessThan);
@@ -4507,85 +4606,44 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
nsTArray<uint32_t> tracks(maxSpan);
nsTArray<TrackSize> plan(mSizes.Length());
plan.SetLength(mSizes.Length());
- for (uint32_t i = 0, len = step2Items.Length(); i < len; ) {
- // Start / end index for items of the same span length:
- const uint32_t spanGroupStartIndex = i;
- uint32_t spanGroupEndIndex = len;
- const uint32_t span = step2Items[i].mSpan;
- for (++i; i < len; ++i) {
- if (step2Items[i].mSpan != span) {
- spanGroupEndIndex = i;
- break;
- }
- }
-
+ nsTArray<TrackSize> itemPlan(mSizes.Length());
+ itemPlan.SetLength(mSizes.Length());
+ // Start / end iterator for items of the same span length:
+ auto spanGroupStart = step2Items.begin();
+ auto spanGroupEnd = spanGroupStart;
+ const auto end = step2Items.end();
+ for (; spanGroupStart != end; spanGroupStart = spanGroupEnd) {
+ while (spanGroupEnd != end &&
+ !Step2ItemData::IsSpanLessThan(*spanGroupStart, *spanGroupEnd)) {
+ ++spanGroupEnd;
+ }
+
+ const uint32_t span = spanGroupStart->mSpan;
bool updatedBase = false; // Did we update any mBase in step 2.1 - 2.3?
TrackSize::StateBits selector(TrackSize::eIntrinsicMinSizing);
if (stateBitsPerSpan[span] & selector) {
// Step 2.1 MinSize to intrinsic min-sizing.
- for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) {
- Step2ItemData& item = step2Items[i];
- if (!(item.mState & selector)) {
- continue;
- }
- nscoord space = item.mMinSize;
- if (space <= 0) {
- continue;
- }
- tracks.ClearAndRetainStorage();
- space = CollectGrowable(space, mSizes, item.mLineRange, selector,
- tracks);
- if (space > 0) {
- DistributeToTrackBases(space, plan, tracks, selector);
- updatedBase = true;
- }
- }
+ updatedBase =
+ GrowSizeForSpanningItems<TrackSizingPhase::eIntrinsicMinimums>(
+ spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector);
}
selector = contentBasedMinSelector;
if (stateBitsPerSpan[span] & selector) {
// Step 2.2 MinContentContribution to min-/max-content (and 'auto' when
// sizing under a min-content constraint) min-sizing.
- for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) {
- Step2ItemData& item = step2Items[i];
- if (!(item.mState & selector)) {
- continue;
- }
- nscoord space = item.mMinContentContribution;
- if (space <= 0) {
- continue;
- }
- tracks.ClearAndRetainStorage();
- space = CollectGrowable(space, mSizes, item.mLineRange, selector,
- tracks);
- if (space > 0) {
- DistributeToTrackBases(space, plan, tracks, selector);
- updatedBase = true;
- }
- }
+ updatedBase |=
+ GrowSizeForSpanningItems<TrackSizingPhase::eContentBasedMinimums>(
+ spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector);
}
selector = maxContentMinSelector;
if (stateBitsPerSpan[span] & selector) {
// Step 2.3 MaxContentContribution to max-content (and 'auto' when
// sizing under a max-content constraint) min-sizing.
- for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) {
- Step2ItemData& item = step2Items[i];
- if (!(item.mState & selector)) {
- continue;
- }
- nscoord space = item.mMaxContentContribution;
- if (space <= 0) {
- continue;
- }
- tracks.ClearAndRetainStorage();
- space = CollectGrowable(space, mSizes, item.mLineRange, selector,
- tracks);
- if (space > 0) {
- DistributeToTrackBases(space, plan, tracks, selector);
- updatedBase = true;
- }
- }
+ updatedBase |=
+ GrowSizeForSpanningItems<TrackSizingPhase::eMaxContentMinimums>(
+ spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector);
}
if (updatedBase) {
@@ -4596,63 +4654,22 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
}
}
}
- if (stateBitsPerSpan[span] & TrackSize::eIntrinsicMaxSizing) {
- plan = mSizes;
- for (TrackSize& sz : plan) {
- if (sz.mLimit == NS_UNCONSTRAINEDSIZE) {
- // use mBase as the planned limit
- } else {
- sz.mBase = sz.mLimit;
- }
- }
+ selector = TrackSize::eIntrinsicMaxSizing;
+ if (stateBitsPerSpan[span] & selector) {
+ const bool willRunStep2_6 =
+ stateBitsPerSpan[span] & TrackSize::eAutoOrMaxContentMaxSizing;
// Step 2.5 MinSize to intrinsic max-sizing.
- for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) {
- Step2ItemData& item = step2Items[i];
- if (!(item.mState & TrackSize::eIntrinsicMaxSizing)) {
- continue;
- }
- nscoord space = item.mMinSize;
- if (space <= 0) {
- continue;
- }
- tracks.ClearAndRetainStorage();
- space = CollectGrowable(space, plan, item.mLineRange,
- TrackSize::eIntrinsicMaxSizing,
- tracks);
- if (space > 0) {
- DistributeToTrackLimits(space, plan, tracks, aFunctions,
- aPercentageBasis);
- }
- }
- for (size_t j = 0, len = mSizes.Length(); j < len; ++j) {
- TrackSize& sz = plan[j];
- sz.mState &= ~(TrackSize::eFrozen | TrackSize::eSkipGrowUnlimited);
- if (sz.mLimit != NS_UNCONSTRAINEDSIZE) {
- sz.mLimit = sz.mBase; // collect the results from 2.5
- }
- }
+ GrowSizeForSpanningItems<TrackSizingPhase::eIntrinsicMaximums>(
+ spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
+ fitContentClamper, willRunStep2_6);
- if (stateBitsPerSpan[span] & TrackSize::eAutoOrMaxContentMaxSizing) {
+ if (willRunStep2_6) {
// Step 2.6 MaxContentContribution to max-content max-sizing.
- for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) {
- Step2ItemData& item = step2Items[i];
- if (!(item.mState & TrackSize::eAutoOrMaxContentMaxSizing)) {
- continue;
- }
- nscoord space = item.mMaxContentContribution;
- if (space <= 0) {
- continue;
- }
- tracks.ClearAndRetainStorage();
- space = CollectGrowable(space, plan, item.mLineRange,
- TrackSize::eAutoOrMaxContentMaxSizing,
- tracks);
- if (space > 0) {
- DistributeToTrackLimits(space, plan, tracks, aFunctions,
- aPercentageBasis);
- }
- }
+ selector = TrackSize::eAutoOrMaxContentMaxSizing;
+ GrowSizeForSpanningItems<TrackSizingPhase::eMaxContentMaximums>(
+ spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
+ fitContentClamper);
}
}
}
@@ -4984,6 +5001,7 @@ nsGridContainerFrame::Tracks::AlignJustifyContent(
default:
MOZ_ASSERT_UNREACHABLE("unknown align-/justify-content value");
between = 0; // just to avoid a compiler warning
+ roundingError = 0; // just to avoid a compiler warning
}
between += mGridGap;
for (TrackSize& sz : mSizes) {
@@ -4998,36 +5016,6 @@ nsGridContainerFrame::Tracks::AlignJustifyContent(
MOZ_ASSERT(!roundingError, "we didn't distribute all rounding error?");
}
-nscoord
-nsGridContainerFrame::Tracks::BackComputedIntrinsicSize(
- const TrackSizingFunctions& aFunctions,
- const nsStyleCoord& aGridGap) const
-{
- // Sum up the current sizes (where percentage tracks were treated as 'auto')
- // in 'size'.
- nscoord size = 0;
- for (size_t i = 0, len = mSizes.Length(); i < len; ++i) {
- size += mSizes[i].mBase;
- }
-
- // Add grid-gap contributions to 'size' and calculate a 'percent' sum.
- float percent = 0.0f;
- size_t numTracks = mSizes.Length();
- if (numTracks > 1) {
- const size_t gridGapCount = numTracks - 1;
- nscoord gridGapLength;
- float gridGapPercent;
- if (::GetPercentSizeParts(aGridGap, &gridGapLength, &gridGapPercent)) {
- percent = gridGapCount * gridGapPercent;
- } else {
- gridGapLength = aGridGap.ToLength();
- }
- size += gridGapCount * gridGapLength;
- }
-
- return std::max(0, nsLayoutUtils::AddPercents(size, percent));
-}
-
void
nsGridContainerFrame::LineRange::ToPositionAndLength(
const nsTArray<TrackSize>& aTrackSizes, nscoord* aPos, nscoord* aLength) const
@@ -5077,10 +5065,15 @@ nsGridContainerFrame::LineRange::ToPositionAndLengthForAbsPos(
: GridLineSide::eBeforeGridGap;
nscoord endPos = aTracks.GridLineEdge(mEnd, side);
*aLength = std::max(aGridOrigin + endPos, 0);
- } else {
+ } else if (MOZ_LIKELY(mStart != mEnd)) {
nscoord pos;
ToPositionAndLength(aTracks.mSizes, &pos, aLength);
*aPos = aGridOrigin + pos;
+ } else {
+ // The grid area only covers removed 'auto-fit' tracks.
+ nscoord pos = aTracks.GridLineEdge(mStart, GridLineSide::eBeforeGridGap);
+ *aPos = aGridOrigin + pos;
+ *aLength = nscoord(0);
}
}
}
@@ -6188,7 +6181,7 @@ nsGridContainerFrame::Reflow(nsPresContext* aPresContext,
LogicalSize computedSize(wm, computedISize, computedBSize);
nscoord consumedBSize = 0;
- nscoord bSize;
+ nscoord bSize = 0;
if (!prevInFlow) {
Grid grid;
grid.PlaceGridItems(gridReflowInput, aReflowInput.ComputedMinSize(),
@@ -6196,7 +6189,12 @@ nsGridContainerFrame::Reflow(nsPresContext* aPresContext,
gridReflowInput.CalculateTrackSizes(grid, computedSize,
SizingConstraint::eNoConstraint);
- bSize = computedSize.BSize(wm);
+ // Note: we can't use GridLineEdge here since we haven't calculated
+ // the rows' mPosition yet (happens in AlignJustifyContent below).
+ for (const auto& sz : gridReflowInput.mRows.mSizes) {
+ bSize += sz.mBase;
+ }
+ bSize += gridReflowInput.mRows.SumOfGridGaps();
} else {
consumedBSize = GetConsumedBSize();
gridReflowInput.InitializeForContinuation(this, consumedBSize);
@@ -6595,8 +6593,14 @@ nsGridContainerFrame::IntrinsicISize(nsRenderingContext* aRenderingContext,
state.mCols.CalculateSizes(state, state.mGridItems, state.mColFunctions,
NS_UNCONSTRAINEDSIZE, &GridArea::mCols,
constraint);
- return state.mCols.BackComputedIntrinsicSize(state.mColFunctions,
- state.mGridStyle->mGridColumnGap);
+ state.mCols.mGridGap =
+ nsLayoutUtils::ResolveGapToLength(state.mGridStyle->mGridColumnGap,
+ NS_UNCONSTRAINEDSIZE);
+ nscoord length = 0;
+ for (const TrackSize& sz : state.mCols.mSizes) {
+ length += sz.mBase;
+ }
+ return length + state.mCols.SumOfGridGaps();
}
nscoord
@@ -7113,6 +7117,9 @@ nsGridContainerFrame::TrackSize::Dump() const
if (mState & eFrozen) {
printf("frozen ");
}
+ if (mState & eModified) {
+ printf("modified ");
+ }
if (mState & eBreakBefore) {
printf("break-before ");
}
diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h
index ec3568483..57f5c460c 100644
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -25,6 +25,7 @@
#include "CaretAssociationHint.h"
#include "FrameProperties.h"
+#include "LayoutConstants.h"
#include "mozilla/layout/FrameChildList.h"
#include "mozilla/Maybe.h"
#include "mozilla/WritingModes.h"
@@ -130,30 +131,12 @@ typedef uint32_t nsSplittableType;
#define NS_FRAME_IS_NOT_SPLITTABLE(type)\
(0 == ((type) & NS_FRAME_SPLITTABLE))
-#define NS_INTRINSIC_WIDTH_UNKNOWN nscoord_MIN
-
//----------------------------------------------------------------------
#define NS_SUBTREE_DIRTY(_frame) \
(((_frame)->GetStateBits() & \
(NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0)
-/**
- * Constant used to indicate an unconstrained size.
- *
- * @see #Reflow()
- */
-#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE
-
-#define NS_INTRINSICSIZE NS_UNCONSTRAINEDSIZE
-#define NS_AUTOHEIGHT NS_UNCONSTRAINEDSIZE
-// +1 is to avoid clamped huge margin values being processed as auto margins
-#define NS_AUTOMARGIN (NS_UNCONSTRAINEDSIZE + 1)
-#define NS_AUTOOFFSET NS_UNCONSTRAINEDSIZE
-// NOTE: there are assumptions all over that these have the same value, namely NS_UNCONSTRAINEDSIZE
-// if any are changed to be a value other than NS_UNCONSTRAINEDSIZE
-// at least update AdjustComputedHeight/Width and test ad nauseum
-
// 1 million CSS pixels less than our max app unit measure.
// For reflowing with an "infinite" available inline space per [css-sizing].
// (reflowing with an NS_UNCONSTRAINEDSIZE available inline size isn't allowed
@@ -2050,23 +2033,27 @@ public:
/**
* Return the horizontal components of padding, border, and margin
* that contribute to the intrinsic width that applies to the parent.
+ * @param aPercentageBasis the percentage basis to use for padding/margin -
+ * i.e. the Containing Block's inline-size
*/
struct IntrinsicISizeOffsetData {
nscoord hPadding, hBorder, hMargin;
- float hPctPadding, hPctMargin;
IntrinsicISizeOffsetData()
: hPadding(0), hBorder(0), hMargin(0)
- , hPctPadding(0.0f), hPctMargin(0.0f)
{}
};
- virtual IntrinsicISizeOffsetData IntrinsicISizeOffsets() = 0;
+ virtual IntrinsicISizeOffsetData
+ IntrinsicISizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE) = 0;
/**
* Return the bsize components of padding, border, and margin
* that contribute to the intrinsic width that applies to the parent.
+ * @param aPercentageBasis the percentage basis to use for padding/margin -
+ * i.e. the Containing Block's inline-size
*/
- IntrinsicISizeOffsetData IntrinsicBSizeOffsets();
+ IntrinsicISizeOffsetData
+ IntrinsicBSizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE);
virtual mozilla::IntrinsicSize GetIntrinsicSize() = 0;
diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp
index 54d93c85a..7e188c247 100644
--- a/layout/generic/nsInlineFrame.cpp
+++ b/layout/generic/nsInlineFrame.cpp
@@ -199,8 +199,7 @@ nsInlineFrame::DestroyFrom(nsIFrame* aDestructRoot)
// Fixup the parent pointers for any child frames on the OverflowList.
// nsIFrame::DestroyFrom depends on that to find the sticky scroll
// container (an ancestor).
- nsIFrame* lineContainer = nsLayoutUtils::FindNearestBlockAncestor(this);
- DrainSelfOverflowListInternal(eForDestroy, lineContainer);
+ overflowFrames->ApplySetParent(this);
}
nsContainerFrame::DestroyFrom(aDestructRoot);
}
@@ -377,8 +376,6 @@ nsInlineFrame::Reflow(nsPresContext* aPresContext,
bool lazilySetParentPointer = false;
- nsIFrame* lineContainer = aReflowInput.mLineLayout->LineContainerFrame();
-
// Check for an overflow list with our prev-in-flow
nsInlineFrame* prevInFlow = (nsInlineFrame*)GetPrevInFlow();
if (prevInFlow) {
@@ -404,12 +401,6 @@ nsInlineFrame::Reflow(nsPresContext* aPresContext,
mFrames.SetFrames(*prevOverflowFrames);
lazilySetParentPointer = true;
} else {
- // Assign all floats to our block if necessary
- if (lineContainer && lineContainer->GetPrevContinuation()) {
- ReparentFloatsForInlineChild(lineContainer,
- prevOverflowFrames->FirstChild(),
- true);
- }
// Insert the new frames at the beginning of the child list
// and set their parent pointer
const nsFrameList::Slice& newFrames =
@@ -443,14 +434,13 @@ nsInlineFrame::Reflow(nsPresContext* aPresContext,
if (aReflowInput.mLineLayout->GetInFirstLine()) {
flags = DrainFlags(flags | eInFirstLine);
}
- DrainSelfOverflowListInternal(flags, lineContainer);
+ DrainSelfOverflowListInternal(flags);
}
- // Set our own reflow state (additional state above and beyond
- // aReflowInput)
+ // Set our own reflow state (additional state above and beyond aReflowInput)
InlineReflowInput irs;
irs.mPrevFrame = nullptr;
- irs.mLineContainer = lineContainer;
+ irs.mLineContainer = aReflowInput.mLineLayout->LineContainerFrame();
irs.mLineLayout = aReflowInput.mLineLayout;
irs.mNextInFlow = (nsInlineFrame*) GetNextInFlow();
irs.mSetParentPointer = lazilySetParentPointer;
@@ -495,8 +485,7 @@ nsInlineFrame::AttributeChanged(int32_t aNameSpaceID,
}
bool
-nsInlineFrame::DrainSelfOverflowListInternal(DrainFlags aFlags,
- nsIFrame* aLineContainer)
+nsInlineFrame::DrainSelfOverflowListInternal(DrainFlags aFlags)
{
AutoFrameListPtr overflowFrames(PresContext(), StealOverflowFrames());
if (overflowFrames) {
@@ -505,11 +494,7 @@ nsInlineFrame::DrainSelfOverflowListInternal(DrainFlags aFlags,
// correct parent pointer. This is sometimes skipped by Reflow.
if (!(aFlags & eDontReparentFrames)) {
nsIFrame* firstChild = overflowFrames->FirstChild();
- if (aLineContainer && aLineContainer->GetPrevContinuation()) {
- ReparentFloatsForInlineChild(aLineContainer, firstChild, true);
- }
- const bool doReparentSC =
- (aFlags & eInFirstLine) && !(aFlags & eForDestroy);
+ const bool doReparentSC = (aFlags & eInFirstLine);
RestyleManagerHandle restyleManager = PresContext()->RestyleManager();
for (nsIFrame* f = firstChild; f; f = f->GetNextSibling()) {
f->SetParent(this);
@@ -539,7 +524,7 @@ nsInlineFrame::DrainSelfOverflowList()
break;
}
}
- return DrainSelfOverflowListInternal(flags, lineContainer);
+ return DrainSelfOverflowListInternal(flags);
}
/* virtual */ bool
@@ -608,23 +593,8 @@ nsInlineFrame::ReflowFrames(nsPresContext* aPresContext,
while (frame) {
// Check if we should lazily set the child frame's parent pointer.
if (irs.mSetParentPointer) {
- bool havePrevBlock =
- irs.mLineContainer && irs.mLineContainer->GetPrevContinuation();
nsIFrame* child = frame;
do {
- // If our block is the first in flow, then any floats under the pulled
- // frame must already belong to our block.
- if (havePrevBlock) {
- // This has to happen before we update frame's parent; we need to
- // know frame's ancestry under its old block.
- // The blockChildren.ContainsFrame check performed by
- // ReparentFloatsForInlineChild here may be slow, but we can't
- // easily avoid it because we don't know where 'frame' originally
- // came from. If we really really have to optimize this we could
- // cache whether frame->GetParent() is under its containing blocks
- // overflowList or not.
- ReparentFloatsForInlineChild(irs.mLineContainer, child, false);
- }
child->SetParent(this);
if (inFirstLine) {
restyleManager->ReparentStyleContext(child);
@@ -1100,20 +1070,13 @@ nsFirstLineFrame::Reflow(nsPresContext* aPresContext,
return; // XXX does this happen? why?
}
- nsIFrame* lineContainer = aReflowInput.mLineLayout->LineContainerFrame();
-
// Check for an overflow list with our prev-in-flow
nsFirstLineFrame* prevInFlow = (nsFirstLineFrame*)GetPrevInFlow();
if (prevInFlow) {
AutoFrameListPtr prevOverflowFrames(aPresContext,
prevInFlow->StealOverflowFrames());
if (prevOverflowFrames) {
- // Assign all floats to our block if necessary
- if (lineContainer && lineContainer->GetPrevContinuation()) {
- ReparentFloatsForInlineChild(lineContainer,
- prevOverflowFrames->FirstChild(),
- true);
- }
+ // Reparent the new frames and their style contexts.
const nsFrameList::Slice& newFrames =
mFrames.InsertFrames(this, nullptr, *prevOverflowFrames);
ReparentChildListStyle(aPresContext, newFrames, this);
@@ -1127,7 +1090,7 @@ nsFirstLineFrame::Reflow(nsPresContext* aPresContext,
// aReflowInput)
InlineReflowInput irs;
irs.mPrevFrame = nullptr;
- irs.mLineContainer = lineContainer;
+ irs.mLineContainer = aReflowInput.mLineLayout->LineContainerFrame();
irs.mLineLayout = aReflowInput.mLineLayout;
irs.mNextInFlow = (nsInlineFrame*) GetNextInFlow();
diff --git a/layout/generic/nsInlineFrame.h b/layout/generic/nsInlineFrame.h
index 00f89065c..36df6be93 100644
--- a/layout/generic/nsInlineFrame.h
+++ b/layout/generic/nsInlineFrame.h
@@ -175,18 +175,13 @@ private:
enum DrainFlags {
eDontReparentFrames = 1, // skip reparenting the overflow list frames
eInFirstLine = 2, // the request is for an inline descendant of a nsFirstLineFrame
- eForDestroy = 4, // the request is from DestroyFrom; in this case we do the
- // minimal work required since the frame is about to be
- // destroyed (just fixup parent pointers)
};
/**
* Move any frames on our overflow list to the end of our principal list.
* @param aFlags one or more of the above DrainFlags
- * @param aLineContainer the nearest line container ancestor
* @return true if there were any overflow frames
*/
- bool DrainSelfOverflowListInternal(DrainFlags aFlags,
- nsIFrame* aLineContainer);
+ bool DrainSelfOverflowListInternal(DrainFlags aFlags);
protected:
nscoord mBaseline;
};
diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp
index 0641c7439..59ef020ce 100644
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -7525,7 +7525,8 @@ nsTextFrame::GetCharacterRectsInRange(int32_t aInOffset,
gfxSkipCharsIterator nextIter(iter);
nextIter.AdvanceOriginal(1);
if (!nextIter.IsOriginalCharSkipped() &&
- !mTextRun->IsClusterStart(nextIter.GetSkippedOffset())) {
+ !mTextRun->IsClusterStart(nextIter.GetSkippedOffset()) &&
+ nextIter.GetOriginalOffset() < kContentEnd) {
FindClusterEnd(mTextRun, kContentEnd, &nextIter);
}
diff --git a/layout/generic/test/mochitest.ini b/layout/generic/test/mochitest.ini
index 934ffc8a4..33dacddab 100644
--- a/layout/generic/test/mochitest.ini
+++ b/layout/generic/test/mochitest.ini
@@ -138,3 +138,7 @@ support-files = file_taintedfilters_feDisplacementMap-tainted-1.svg file_tainted
support-files = file_scroll_position_restore.html
[test_scroll_animation_restore.html]
[test_scroll_position_iframe.html]
+[test_grid_track_sizing_algo_001.html]
+skip-if = debug == true # the test is slow
+[test_grid_track_sizing_algo_002.html]
+skip-if = debug == true # the test is slow
diff --git a/layout/generic/test/test_grid_track_sizing_algo_001.html b/layout/generic/test/test_grid_track_sizing_algo_001.html
new file mode 100644
index 000000000..68956c2df
--- /dev/null
+++ b/layout/generic/test/test_grid_track_sizing_algo_001.html
@@ -0,0 +1,1641 @@
+<!DOCTYPE HTML>
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html><head>
+ <meta charset="utf-8">
+ <title>CSS Grid Test: intrinsic track sizing with spanning items</title>
+ <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1425599">
+ <link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content">
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <style type="text/css">
+body,html { color:black; background:white; font-family:monospace; font-size:16px; padding:0; margin:0; }
+* { vertical-align: top; line-height: 1px; }
+
+.grid {
+ display: inline-grid;
+ grid-template-rows: 1px;
+ grid-auto-rows: 10px;
+ border: 1px solid;
+ place-content: start;
+ place-items: start;
+}
+
+x {
+ grid-row: 1;
+ height: 1px;
+ background: grey;
+}
+
+x:nth-child(1) { background: lime; width: 3px; grid-column: 1/span 2; }
+x:nth-child(2) { background: silver; width: 6px; grid-column: 2/span 4; }
+x:nth-child(3) { background: blue; width: 12px; grid-column: 2/span 2; }
+ </style>
+</head>
+<body>
+
+<script>
+let min1 = [
+ "0", "4px"
+];
+let min2 = [
+ "auto", "min-content", "max-content"
+];
+let max1 = [
+ "8px"
+];
+let max2 = [
+ "auto", "min-content", "max-content"
+];
+
+var track = [];
+min1.forEach((min) => { max2.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+min2.forEach((min) => { max2.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+min2.forEach((min) => { max1.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+min2.forEach((min) => { max2.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+track.push("fit-content(8px)");
+
+var cols = [];
+track.forEach((c1) => {
+ cols.push(c1 + " " + c1 + " " + c1 + " " + c1 + " " + c1);
+ track.forEach((c2) => {
+ if (c1 != c2) {
+ cols.push(c1 + " " + c2 + " " + c2 + " " + c2 + " " + c2);
+ cols.push(c2 + " " + c1 + " " + c1 + " " + c2 + " " + c2);
+ }
+})});
+
+document.body.style.display = 'none';
+cols.forEach((col) => {
+ let grid = document.createElement('div');
+ grid.className = "grid";
+ grid.style.gridTemplateColumns = col;
+ grid.appendChild(document.createElement('x'))
+ grid.appendChild(document.createElement('x'))
+ grid.appendChild(document.createElement('x'))
+ document.body.appendChild(grid);
+});
+document.body.style.display = '';
+</script>
+
+<script>
+var actual = [];
+[...document.querySelectorAll('.grid')].forEach(function(e) {
+ let cs = window.getComputedStyle(e);
+ actual.push([cs.gridTemplateColumns, cs.width]);
+});
+
+function dumpResult() {
+ var s = "";
+ actual.forEach(v => {
+ s += '["' + v[0] + '","' + v[1] + '"],\n';
+ });
+ let pre = document.createElement("pre");
+ pre.innerHTML = s;
+ document.body.appendChild(pre);
+}
+
+let expected = [
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 8px 8px 8px 8px","32px"],
+["8px 6px 6px 8px 8px","36px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 3px 3px","21px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 4px 4px","24px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 6px 6px 8px 8px","36px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["4px 6px 6px 0px 0px","16px"],
+["0px 6px 6px 0px 0px","12px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 0px 0px","20px"],
+["0px 8px 8px 0px 0px","16px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 4px 4px","28px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["8px 6px 6px 0px 0px","20px"],
+["1.5px 8px 8px 0px 0px","17.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["3px 6px 6px 0px 0px","15px"],
+["0px 6px 6px 0px 0px","12px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["0px 6px 6px 4px 4px","20px"],
+["4px 6px 6px 4px 4px","24px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 8px 8px 8px 8px","33.5px"],
+["8px 6px 6px 8px 8px","36px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+["1.5px 6px 6px 0px 0px","13.5px"],
+];
+
+function test() {
+ ok(expected.length > 0, "sanity check");
+ for (i = 0; i < expected.length; ++i) {
+ var msg = "";
+ if (actual[i][0] != expected[i][0]) {
+ msg = "'grid-template-columns' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML;
+ is(actual[i][0], expected[i][0], msg);
+ }
+ if (actual[i][1] != expected[i][1]) {
+ msg = "'width' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML;
+ is(actual[i][1], expected[i][1], msg);
+ }
+ if (msg != "") {
+ i = expected.length; // stop after first failed grid by default
+ }
+ }
+ SimpleTest.finish();
+}
+
+</script>
+
+<script>
+window.onload = function() { setTimeout(test, 0); };
+SimpleTest.waitForExplicitFinish();
+</script>
+
+</body>
+</html>
diff --git a/layout/generic/test/test_grid_track_sizing_algo_002.html b/layout/generic/test/test_grid_track_sizing_algo_002.html
new file mode 100644
index 000000000..40f50e20f
--- /dev/null
+++ b/layout/generic/test/test_grid_track_sizing_algo_002.html
@@ -0,0 +1,1641 @@
+<!DOCTYPE HTML>
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html><head>
+ <meta charset="utf-8">
+ <title>CSS Grid Test: intrinsic track sizing with spanning items</title>
+ <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1425599">
+ <link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content">
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <style type="text/css">
+body,html { color:black; background:white; font-family:monospace; font-size:16px; padding:0; margin:0; }
+* { vertical-align: top; line-height: 1px; }
+
+.grid {
+ display: inline-grid;
+ grid-template-rows: 1px;
+ grid-auto-rows: 10px;
+ border: 1px solid;
+ place-content: start;
+ place-items: start;
+}
+
+x {
+ grid-row: 1;
+ height: 1px;
+ background: grey;
+}
+
+x:nth-child(1) { background: lime; width: 3px; grid-column: 1/span 2; }
+x:nth-child(2) { background: silver; width: 6px; grid-column: 2/span 3; }
+x:nth-child(3) { background: blue; width: 12px; grid-column: 1/span 2; }
+ </style>
+</head>
+<body>
+
+<script>
+let min1 = [
+ "0", "4px"
+];
+let min2 = [
+ "auto", "min-content", "max-content"
+];
+let max1 = [
+ "8px"
+];
+let max2 = [
+ "auto", "min-content", "max-content"
+];
+
+var track = [];
+min1.forEach((min) => { max2.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+min2.forEach((min) => { max2.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+min2.forEach((min) => { max1.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+min2.forEach((min) => { max2.forEach((max) => {
+ track.push("minmax(" + min + "," + max + ")");
+})});
+track.push("fit-content(8px)");
+
+var cols = [];
+track.forEach((c1) => {
+ cols.push(c1 + " " + c1 + " " + c1 + " " + c1 + " " + c1);
+ track.forEach((c2) => {
+ if (c1 != c2) {
+ cols.push(c1 + " " + c2 + " " + c2 + " " + c2 + " " + c2);
+ cols.push(c2 + " " + c1 + " " + c1 + " " + c2 + " " + c2);
+ }
+})});
+
+document.body.style.display = 'none';
+cols.forEach((col) => {
+ let grid = document.createElement('div');
+ grid.className = "grid";
+ grid.style.gridTemplateColumns = col;
+ grid.appendChild(document.createElement('x'))
+ grid.appendChild(document.createElement('x'))
+ grid.appendChild(document.createElement('x'))
+ document.body.appendChild(grid);
+});
+document.body.style.display = '';
+</script>
+
+<script>
+var actual = [];
+[...document.querySelectorAll('.grid')].forEach(function(e) {
+ let cs = window.getComputedStyle(e);
+ actual.push([cs.gridTemplateColumns, cs.width]);
+});
+
+function dumpResult() {
+ var s = "";
+ actual.forEach(v => {
+ s += '["' + v[0] + '","' + v[1] + '"],\n';
+ });
+ let pre = document.createElement("pre");
+ pre.innerHTML = s;
+ document.body.appendChild(pre);
+}
+
+let expected = [
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["4px 8px 4px 4px 4px","24px"],
+["8px 4px 0px 4px 4px","20px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 8px 8px 8px","36px"],
+["12px 0px 0px 8px 8px","28px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 0px 6px 0px","18px"],
+["6px 6px 4px 4px 4px","24px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["6px 6px 4px 4px 4px","24px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["6px 6px 4px 4px 4px","24px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["8px 4px 1px 1px 0px","14px"],
+["4px 8px 4px 0px 0px","16px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["6px 6px 4px 4px 4px","24px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 8px 8px 8px","36px"],
+["8px 4px 4px 8px 8px","32px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["4px 8px 0px 0px 0px","12px"],
+["8px 4px 4px 0px 0px","16px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["8px 8px 8px 8px 8px","40px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 8px 8px 8px 8px","40px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 8px 8px 8px 8px","40px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 8px 0px 0px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 8px 4px 4px","28px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 8px 8px 8px 8px","40px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["8px 6px 0px 0px 0px","14px"],
+["6px 8px 8px 0px 0px","22px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["12px 0px 3px 3px 0px","18px"],
+["0px 12px 0px 0px 0px","12px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["8px 4px 4px 4px 4px","24px"],
+["4px 8px 0px 4px 4px","20px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 8px 8px 8px 8px","38px"],
+["8px 6px 0px 8px 8px","30px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+["6px 6px 0px 0px 0px","12px"],
+];
+
+function test() {
+ ok(expected.length > 0, "sanity check");
+ for (i = 0; i < expected.length; ++i) {
+ var msg = "";
+ if (actual[i][0] != expected[i][0]) {
+ msg = "'grid-template-columns' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML;
+ is(actual[i][0], expected[i][0], msg);
+ }
+ if (actual[i][1] != expected[i][1]) {
+ msg = "'width' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML;
+ is(actual[i][1], expected[i][1], msg);
+ }
+ if (msg != "") {
+ i = expected.length; // stop after first failed grid by default
+ }
+ }
+ SimpleTest.finish();
+}
+
+</script>
+
+<script>
+window.onload = function() { setTimeout(test, 0); };
+SimpleTest.waitForExplicitFinish();
+</script>
+
+</body>
+</html>