Only include one variable per declaration statement
This removes VarDeclarationsStatement entirely. VarDeclaration instances
appear directly as statements in Programs. SkSL that declares multiple
variables in a single declaration is transformed to represent that as a
series of VarDeclaration statements.
Similarly, global variable declarations are represented by
GlobalVarDeclaration program elements, one per variable.
Bug: skia:10806
Change-Id: Idd8a2d971a8217733ed57f0dd2249d62f2f0e9c5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/323102
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/src/core/SkRuntimeEffect.cpp b/src/core/SkRuntimeEffect.cpp
index ca37e16..5277aa2 100644
--- a/src/core/SkRuntimeEffect.cpp
+++ b/src/core/SkRuntimeEffect.cpp
@@ -153,68 +153,66 @@
// Go through program elements, pulling out information that we need
for (const auto& elem : *program) {
// Variables (uniform, varying, etc.)
- if (elem.kind() == SkSL::ProgramElement::Kind::kVar) {
- const auto& varDecls = static_cast<const SkSL::VarDeclarations&>(elem);
- for (const auto& varDecl : varDecls.fVars) {
- const SkSL::Variable& var =
- *(static_cast<const SkSL::VarDeclaration&>(*varDecl).fVar);
- const SkSL::Type& varType = var.type();
+ if (elem.is<SkSL::GlobalVarDeclaration>()) {
+ const auto& varDecl = elem.as<SkSL::GlobalVarDeclaration>().fDecl;
- // Varyings (only used in conjunction with drawVertices)
- if (var.fModifiers.fFlags & SkSL::Modifiers::kVarying_Flag) {
- varyings.push_back({var.name(),
- varType.typeKind() == SkSL::Type::TypeKind::kVector
- ? varType.columns()
- : 1});
+ const SkSL::Variable& var = *varDecl->fVar;
+ const SkSL::Type& varType = var.type();
+
+ // Varyings (only used in conjunction with drawVertices)
+ if (var.fModifiers.fFlags & SkSL::Modifiers::kVarying_Flag) {
+ varyings.push_back({var.name(),
+ varType.typeKind() == SkSL::Type::TypeKind::kVector
+ ? varType.columns()
+ : 1});
+ }
+ // Fragment Processors (aka 'shader'): These are child effects
+ else if (&varType == ctx.fFragmentProcessor_Type.get()) {
+ children.push_back(var.name());
+ sampleUsages.push_back(SkSL::Analysis::GetSampleUsage(*program, var));
+ }
+ // 'uniform' variables
+ else if (var.fModifiers.fFlags & SkSL::Modifiers::kUniform_Flag) {
+ Uniform uni;
+ uni.fName = var.name();
+ uni.fFlags = 0;
+ uni.fCount = 1;
+
+ const SkSL::Type* type = &var.type();
+ if (type->typeKind() == SkSL::Type::TypeKind::kArray) {
+ uni.fFlags |= Uniform::kArray_Flag;
+ uni.fCount = type->columns();
+ type = &type->componentType();
}
- // Fragment Processors (aka 'shader'): These are child effects
- else if (&varType == ctx.fFragmentProcessor_Type.get()) {
- children.push_back(var.name());
- sampleUsages.push_back(SkSL::Analysis::GetSampleUsage(*program, var));
+
+ if (!init_uniform_type(ctx, type, &uni)) {
+ RETURN_FAILURE("Invalid uniform type: '%s'", type->displayName().c_str());
}
- // 'uniform' variables
- else if (var.fModifiers.fFlags & SkSL::Modifiers::kUniform_Flag) {
- Uniform uni;
- uni.fName = var.name();
- uni.fFlags = 0;
- uni.fCount = 1;
- const SkSL::Type* type = &var.type();
- if (type->typeKind() == SkSL::Type::TypeKind::kArray) {
- uni.fFlags |= Uniform::kArray_Flag;
- uni.fCount = type->columns();
- type = &type->componentType();
+ const SkSL::StringFragment& marker(var.fModifiers.fLayout.fMarker);
+ if (marker.fLength) {
+ uni.fFlags |= Uniform::kMarker_Flag;
+ allowColorFilter = false;
+ if (!parse_marker(marker, &uni.fMarker, &uni.fFlags)) {
+ RETURN_FAILURE("Invalid 'marker' string: '%.*s'", (int)marker.fLength,
+ marker.fChars);
}
-
- if (!init_uniform_type(ctx, type, &uni)) {
- RETURN_FAILURE("Invalid uniform type: '%s'", type->displayName().c_str());
- }
-
- const SkSL::StringFragment& marker(var.fModifiers.fLayout.fMarker);
- if (marker.fLength) {
- uni.fFlags |= Uniform::kMarker_Flag;
- allowColorFilter = false;
- if (!parse_marker(marker, &uni.fMarker, &uni.fFlags)) {
- RETURN_FAILURE("Invalid 'marker' string: '%.*s'", (int)marker.fLength,
- marker.fChars);
- }
- }
-
- if (var.fModifiers.fLayout.fFlags & SkSL::Layout::Flag::kSRGBUnpremul_Flag) {
- uni.fFlags |= Uniform::kSRGBUnpremul_Flag;
- }
-
- uni.fOffset = offset;
- offset += uni.sizeInBytes();
- SkASSERT(SkIsAlign4(offset));
-
- uniforms.push_back(uni);
}
+
+ if (var.fModifiers.fLayout.fFlags & SkSL::Layout::Flag::kSRGBUnpremul_Flag) {
+ uni.fFlags |= Uniform::kSRGBUnpremul_Flag;
+ }
+
+ uni.fOffset = offset;
+ offset += uni.sizeInBytes();
+ SkASSERT(SkIsAlign4(offset));
+
+ uniforms.push_back(uni);
}
}
// Functions
- else if (elem.kind() == SkSL::ProgramElement::Kind::kFunction) {
- const auto& func = static_cast<const SkSL::FunctionDefinition&>(elem);
+ else if (elem.is<SkSL::FunctionDefinition>()) {
+ const auto& func = elem.as<SkSL::FunctionDefinition>();
const SkSL::FunctionDeclaration& decl = func.fDeclaration;
if (decl.name() == "main") {
hasMain = true;
diff --git a/src/gpu/effects/generated/GrAARectEffect.cpp b/src/gpu/effects/generated/GrAARectEffect.cpp
index 999ed35..7c0ad9c 100644
--- a/src/gpu/effects/generated/GrAARectEffect.cpp
+++ b/src/gpu/effects/generated/GrAARectEffect.cpp
@@ -40,7 +40,9 @@
alpha = half(all(greaterThan(float4(sk_FragCoord.xy, %s.zw), float4(%s.xy, sk_FragCoord.xy))) ? 1 : 0);
break;
default:
- half xSub, ySub;
+ half xSub;
+ half ySub;
+
xSub = min(half(sk_FragCoord.x - %s.x), 0.0);
xSub += min(half(%s.z - sk_FragCoord.x), 0.0);
ySub = min(half(sk_FragCoord.y - %s.y), 0.0);
diff --git a/src/gpu/effects/generated/GrHighContrastFilterEffect.cpp b/src/gpu/effects/generated/GrHighContrastFilterEffect.cpp
index f00f0ba..58f9aca 100644
--- a/src/gpu/effects/generated/GrHighContrastFilterEffect.cpp
+++ b/src/gpu/effects/generated/GrHighContrastFilterEffect.cpp
@@ -48,6 +48,8 @@
return t < 0.1666666716337204 ? p + ((q - p) * 6.0) * t : (t < 0.5 ? q : (t < 0.66666668653488159 ? p + ((q - p) * (0.66666668653488159 - t)) * 6.0 : p));
)SkSL",
&HSLToRGB_name);
+ fragBuilder->codeAppendf(
+ R"SkSL(;)SkSL");
SkString _sample896 = this->invokeChild(0, args);
fragBuilder->codeAppendf(
R"SkSL(
diff --git a/src/gpu/effects/generated/GrLumaColorFilterEffect.cpp b/src/gpu/effects/generated/GrLumaColorFilterEffect.cpp
index 455b723..6033f99 100644
--- a/src/gpu/effects/generated/GrLumaColorFilterEffect.cpp
+++ b/src/gpu/effects/generated/GrLumaColorFilterEffect.cpp
@@ -27,7 +27,7 @@
SkString _sample870 = this->invokeChild(0, args);
fragBuilder->codeAppendf(
R"SkSL(half4 inputColor = %s;
-
+;
half luma = clamp(dot(half3(0.2125999927520752, 0.71520000696182251, 0.072200000286102295), inputColor.xyz), 0.0, 1.0);
%s = half4(0.0, 0.0, 0.0, luma);
)SkSL",
diff --git a/src/gpu/effects/generated/GrRGBToHSLFilterEffect.cpp b/src/gpu/effects/generated/GrRGBToHSLFilterEffect.cpp
index 5dbe823..4dd9534 100644
--- a/src/gpu/effects/generated/GrRGBToHSLFilterEffect.cpp
+++ b/src/gpu/effects/generated/GrRGBToHSLFilterEffect.cpp
@@ -29,7 +29,7 @@
R"SkSL(half4 c = %s;
half4 p = c.y < c.z ? half4(c.zy, -1.0, 0.66666668653488159) : half4(c.yz, 0.0, -0.3333333432674408);
half4 q = c.x < p.x ? half4(p.x, c.x, p.yw) : half4(c.x, p.x, p.yz);
-
+;
half pmV = q.x;
half pmC = pmV - min(q.y, q.z);
half pmL = pmV - pmC * 0.5;
diff --git a/src/gpu/effects/generated/GrRectBlurEffect.cpp b/src/gpu/effects/generated/GrRectBlurEffect.cpp
index 89cdc5d..9763f3f 100644
--- a/src/gpu/effects/generated/GrRectBlurEffect.cpp
+++ b/src/gpu/effects/generated/GrRectBlurEffect.cpp
@@ -49,7 +49,9 @@
}
fragBuilder->codeAppendf(
R"SkSL(/* key */ bool highp = %s;
-half xCoverage, yCoverage;
+half xCoverage;
+half yCoverage;
+
float2 pos = sk_FragCoord.xy;
@if (%s) {
pos = (%s * float3(pos, 1.0)).xy;
diff --git a/src/gpu/gradients/generated/GrDualIntervalGradientColorizer.cpp b/src/gpu/gradients/generated/GrDualIntervalGradientColorizer.cpp
index 36fad7f..7002ccc 100644
--- a/src/gpu/gradients/generated/GrDualIntervalGradientColorizer.cpp
+++ b/src/gpu/gradients/generated/GrDualIntervalGradientColorizer.cpp
@@ -47,7 +47,9 @@
kHalf_GrSLType, "threshold");
fragBuilder->codeAppendf(
R"SkSL(half t = half(%s.x);
-float4 scale, bias;
+float4 scale;
+float4 bias;
+
if (t < %s) {
scale = %s;
bias = %s;
diff --git a/src/gpu/gradients/generated/GrUnrolledBinaryGradientColorizer.cpp b/src/gpu/gradients/generated/GrUnrolledBinaryGradientColorizer.cpp
index c826afc..bdb857e 100644
--- a/src/gpu/gradients/generated/GrUnrolledBinaryGradientColorizer.cpp
+++ b/src/gpu/gradients/generated/GrUnrolledBinaryGradientColorizer.cpp
@@ -129,7 +129,9 @@
kHalf4_GrSLType, "thresholds9_13");
fragBuilder->codeAppendf(
R"SkSL(half t = half(%s.x);
-float4 scale, bias;
+float4 scale;
+float4 bias;
+
if (%d <= 4 || t < %s.w) {
if (%d <= 2 || t < %s.y) {
if (%d <= 1 || t < %s.x) {
diff --git a/src/sksl/SkSLAnalysis.cpp b/src/sksl/SkSLAnalysis.cpp
index 726c0fc..9804945 100644
--- a/src/sksl/SkSLAnalysis.cpp
+++ b/src/sksl/SkSLAnalysis.cpp
@@ -35,7 +35,6 @@
#include "src/sksl/ir/SkSLNop.h"
#include "src/sksl/ir/SkSLReturnStatement.h"
#include "src/sksl/ir/SkSLSwitchStatement.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
// Expressions
@@ -486,10 +485,6 @@
}
return v.fValue && this->visitExpression(*v.fValue);
}
- case Statement::Kind::kVarDeclarations:
- return this->visitProgramElement(
- *s.template as<VarDeclarationsStatement>().fDeclaration);
-
case Statement::Kind::kWhile: {
auto& w = s.template as<WhileStatement>();
return this->visitExpression(*w.fTest) || this->visitStatement(*w.fStatement);
@@ -520,11 +515,9 @@
}
return false;
- case ProgramElement::Kind::kVar:
- for (auto& v : pe.template as<VarDeclarations>().fVars) {
- if (this->visitStatement(*v)) {
- return true;
- }
+ case ProgramElement::Kind::kGlobalVar:
+ if (this->visitStatement(*pe.template as<GlobalVarDeclaration>().fDecl)) {
+ return true;
}
return false;
diff --git a/src/sksl/SkSLByteCodeGenerator.cpp b/src/sksl/SkSLByteCodeGenerator.cpp
index 512fbd26..f71328d 100644
--- a/src/sksl/SkSLByteCodeGenerator.cpp
+++ b/src/sksl/SkSLByteCodeGenerator.cpp
@@ -159,21 +159,19 @@
fFunctions.push_back(&e.as<FunctionDefinition>());
break;
}
- case ProgramElement::Kind::kVar: {
- const VarDeclarations& decl = e.as<VarDeclarations>();
- for (const auto& v : decl.fVars) {
- const Variable* declVar = v->as<VarDeclaration>().fVar;
- if (declVar->type() == *fContext.fFragmentProcessor_Type) {
- fOutput->fChildFPCount++;
- }
- if (declVar->fModifiers.fLayout.fBuiltin >= 0 || is_in(*declVar)) {
- continue;
- }
- if (is_uniform(*declVar)) {
- this->gatherUniforms(declVar->type(), declVar->name());
- } else {
- fOutput->fGlobalSlotCount += SlotCount(declVar->type());
- }
+ case ProgramElement::Kind::kGlobalVar: {
+ const GlobalVarDeclaration& decl = e.as<GlobalVarDeclaration>();
+ const Variable* declVar = decl.fDecl->fVar;
+ if (declVar->type() == *fContext.fFragmentProcessor_Type) {
+ fOutput->fChildFPCount++;
+ }
+ if (declVar->fModifiers.fLayout.fBuiltin >= 0 || is_in(*declVar)) {
+ continue;
+ }
+ if (is_uniform(*declVar)) {
+ this->gatherUniforms(declVar->type(), declVar->name());
+ } else {
+ fOutput->fGlobalSlotCount += SlotCount(declVar->type());
}
break;
}
@@ -457,19 +455,17 @@
if (var.type() == *fContext.fFragmentProcessor_Type) {
int offset = 0;
for (const auto& e : fProgram) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decl = e.as<VarDeclarations>();
- for (const auto& v : decl.fVars) {
- const Variable* declVar = v->as<VarDeclaration>().fVar;
- if (declVar->type() != *fContext.fFragmentProcessor_Type) {
- continue;
- }
- if (declVar == &var) {
- SkASSERT(offset <= 255);
- return { offset, Storage::kChildFP };
- }
- offset++;
+ if (e.is<GlobalVarDeclaration>()) {
+ const GlobalVarDeclaration& decl = e.as<GlobalVarDeclaration>();
+ const Variable* declVar = decl.fDecl->fVar;
+ if (declVar->type() != *fContext.fFragmentProcessor_Type) {
+ continue;
}
+ if (declVar == &var) {
+ SkASSERT(offset <= 255);
+ return { offset, Storage::kChildFP };
+ }
+ offset++;
}
}
SkASSERT(false);
@@ -487,22 +483,20 @@
int offset = 0;
bool isUniform = is_uniform(var);
for (const auto& e : fProgram) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decl = e.as<VarDeclarations>();
- for (const auto& v : decl.fVars) {
- const Variable* declVar = v->as<VarDeclaration>().fVar;
- if (declVar->fModifiers.fLayout.fBuiltin >= 0 || is_in(*declVar)) {
- continue;
- }
- if (isUniform != is_uniform(*declVar)) {
- continue;
- }
- if (declVar == &var) {
- SkASSERT(offset <= 255);
- return { offset, isUniform ? Storage::kUniform : Storage::kGlobal };
- }
- offset += SlotCount(declVar->type());
+ if (e.is<GlobalVarDeclaration>()) {
+ const GlobalVarDeclaration& decl = e.as<GlobalVarDeclaration>();
+ const Variable* declVar = decl.fDecl->fVar;
+ if (declVar->fModifiers.fLayout.fBuiltin >= 0 || is_in(*declVar)) {
+ continue;
}
+ if (isUniform != is_uniform(*declVar)) {
+ continue;
+ }
+ if (declVar == &var) {
+ SkASSERT(offset <= 255);
+ return { offset, isUniform ? Storage::kUniform : Storage::kGlobal };
+ }
+ offset += SlotCount(declVar->type());
}
}
SkASSERT(false);
@@ -1763,17 +1757,14 @@
abort();
}
-void ByteCodeGenerator::writeVarDeclarations(const VarDeclarations& v) {
- for (const auto& declStatement : v.fVars) {
- const VarDeclaration& decl = declStatement->as<VarDeclaration>();
- // we need to grab the location even if we don't use it, to ensure it has been allocated
- Location location = this->getLocation(*decl.fVar);
- if (decl.fValue) {
- this->writeExpression(*decl.fValue);
- int count = SlotCount(decl.fValue->type());
- this->write(ByteCodeInstruction::kStore, count);
- this->write8(location.fSlot);
- }
+void ByteCodeGenerator::writeVarDeclaration(const VarDeclaration& decl) {
+ // we need to grab the location even if we don't use it, to ensure it has been allocated
+ Location location = this->getLocation(*decl.fVar);
+ if (decl.fValue) {
+ this->writeExpression(*decl.fValue);
+ int count = SlotCount(decl.fValue->type());
+ this->write(ByteCodeInstruction::kStore, count);
+ this->write8(location.fSlot);
}
}
@@ -1824,8 +1815,8 @@
case Statement::Kind::kSwitch:
this->writeSwitchStatement(s.as<SwitchStatement>());
break;
- case Statement::Kind::kVarDeclarations:
- this->writeVarDeclarations(*s.as<VarDeclarationsStatement>().fDeclaration);
+ case Statement::Kind::kVarDeclaration:
+ this->writeVarDeclaration(s.as<VarDeclaration>());
break;
case Statement::Kind::kWhile:
this->writeWhileStatement(s.as<WhileStatement>());
diff --git a/src/sksl/SkSLByteCodeGenerator.h b/src/sksl/SkSLByteCodeGenerator.h
index f69bbb9..8618995 100644
--- a/src/sksl/SkSLByteCodeGenerator.h
+++ b/src/sksl/SkSLByteCodeGenerator.h
@@ -45,7 +45,6 @@
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariableReference.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
#include "src/sksl/spirv.h"
@@ -245,7 +244,7 @@
std::unique_ptr<ByteCodeFunction> writeFunction(const FunctionDefinition& f);
- void writeVarDeclarations(const VarDeclarations& decl);
+ void writeVarDeclaration(const VarDeclaration& decl);
void writeVariableExpression(const Expression& expr);
diff --git a/src/sksl/SkSLCFGGenerator.cpp b/src/sksl/SkSLCFGGenerator.cpp
index fb13049..d562aaf 100644
--- a/src/sksl/SkSLCFGGenerator.cpp
+++ b/src/sksl/SkSLCFGGenerator.cpp
@@ -23,7 +23,6 @@
#include "src/sksl/ir/SkSLSwitchStatement.h"
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
namespace SkSL {
@@ -508,17 +507,10 @@
cfg.currentBlock().fNodes.push_back(BasicBlock::MakeStatement(s));
break;
}
- case Statement::Kind::kVarDeclarations: {
- VarDeclarationsStatement& decls = (*s)->as<VarDeclarationsStatement>();
- for (auto& stmt : decls.fDeclaration->fVars) {
- if (stmt->kind() == Statement::Kind::kNop) {
- continue;
- }
- VarDeclaration& vd = stmt->as<VarDeclaration>();
- if (vd.fValue) {
- this->addExpression(cfg, &vd.fValue, /*constantPropagate=*/true);
- }
- cfg.currentBlock().fNodes.push_back(BasicBlock::MakeStatement(&stmt));
+ case Statement::Kind::kVarDeclaration: {
+ VarDeclaration& vd = (*s)->as<VarDeclaration>();
+ if (vd.fValue) {
+ this->addExpression(cfg, &vd.fValue, /*constantPropagate=*/true);
}
cfg.currentBlock().fNodes.push_back(BasicBlock::MakeStatement(s));
break;
diff --git a/src/sksl/SkSLCPPCodeGenerator.cpp b/src/sksl/SkSLCPPCodeGenerator.cpp
index 77898b2..77a3933 100644
--- a/src/sksl/SkSLCPPCodeGenerator.cpp
+++ b/src/sksl/SkSLCPPCodeGenerator.cpp
@@ -409,25 +409,18 @@
int CPPCodeGenerator::getChildFPIndex(const Variable& var) const {
int index = 0;
- bool found = false;
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const auto& raw : decls.fVars) {
- const VarDeclaration& decl = raw->as<VarDeclaration>();
- if (decl.fVar == &var) {
- found = true;
- } else if (decl.fVar->type().nonnullable() == *fContext.fFragmentProcessor_Type) {
- ++index;
- }
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ if (decl.fVar == &var) {
+ return index;
+ } else if (decl.fVar->type().nonnullable() == *fContext.fFragmentProcessor_Type) {
+ ++index;
}
}
- if (found) {
- break;
- }
}
- SkASSERT(found);
- return index;
+ SkDEBUGFAIL("child fragment processor not found");
+ return 0;
}
void CPPCodeGenerator::writeFunctionCall(const FunctionCall& c) {
@@ -661,12 +654,9 @@
switch (p.kind()) {
case ProgramElement::Kind::kSection:
return;
- case ProgramElement::Kind::kVar: {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- if (!decls.fVars.size()) {
- return;
- }
- const Variable& var = *decls.fVars[0]->as<VarDeclaration>().fVar;
+ case ProgramElement::Kind::kGlobalVar: {
+ const GlobalVarDeclaration& decl = p.as<GlobalVarDeclaration>();
+ const Variable& var = *decl.fDecl->fVar;
if (var.fModifiers.fFlags & (Modifiers::kIn_Flag | Modifiers::kUniform_Flag) ||
-1 != var.fModifiers.fLayout.fBuiltin) {
return;
@@ -711,38 +701,36 @@
void CPPCodeGenerator::writePrivateVars() {
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const auto& raw : decls.fVars) {
- VarDeclaration& decl = raw->as<VarDeclaration>();
- if (is_private(*decl.fVar)) {
- if (decl.fVar->type() == *fContext.fFragmentProcessor_Type) {
- fErrors.error(decl.fOffset,
- "fragmentProcessor variables must be declared 'in'");
- return;
- }
- this->writef("%s %s = %s;\n",
- HCodeGenerator::FieldType(fContext, decl.fVar->type(),
- decl.fVar->fModifiers.fLayout).c_str(),
- String(decl.fVar->name()).c_str(),
- default_value(*decl.fVar).c_str());
- } else if (decl.fVar->fModifiers.fLayout.fFlags & Layout::kTracked_Flag) {
- // An auto-tracked uniform in variable, so add a field to hold onto the prior
- // state. Note that tracked variables must be uniform in's and that is validated
- // before writePrivateVars() is called.
- const UniformCTypeMapper* mapper = UniformCTypeMapper::Get(fContext, *decl.fVar);
- SkASSERT(mapper && mapper->supportsTracking());
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ if (is_private(*decl.fVar)) {
+ if (decl.fVar->type() == *fContext.fFragmentProcessor_Type) {
+ fErrors.error(decl.fOffset,
+ "fragmentProcessor variables must be declared 'in'");
+ return;
+ }
+ this->writef("%s %s = %s;\n",
+ HCodeGenerator::FieldType(fContext, decl.fVar->type(),
+ decl.fVar->fModifiers.fLayout)
+ .c_str(),
+ String(decl.fVar->name()).c_str(),
+ default_value(*decl.fVar).c_str());
+ } else if (decl.fVar->fModifiers.fLayout.fFlags & Layout::kTracked_Flag) {
+ // An auto-tracked uniform in variable, so add a field to hold onto the prior
+ // state. Note that tracked variables must be uniform in's and that is validated
+ // before writePrivateVars() is called.
+ const UniformCTypeMapper* mapper = UniformCTypeMapper::Get(fContext, *decl.fVar);
+ SkASSERT(mapper && mapper->supportsTracking());
- String name = HCodeGenerator::FieldName(String(decl.fVar->name()).c_str());
- // The member statement is different if the mapper reports a default value
- if (mapper->defaultValue().size() > 0) {
- this->writef("%s %sPrev = %s;\n",
- Layout::CTypeToStr(mapper->ctype()), name.c_str(),
- mapper->defaultValue().c_str());
- } else {
- this->writef("%s %sPrev;\n",
- Layout::CTypeToStr(mapper->ctype()), name.c_str());
- }
+ String name = HCodeGenerator::FieldName(String(decl.fVar->name()).c_str());
+ // The member statement is different if the mapper reports a default value
+ if (mapper->defaultValue().size() > 0) {
+ this->writef("%s %sPrev = %s;\n",
+ Layout::CTypeToStr(mapper->ctype()), name.c_str(),
+ mapper->defaultValue().c_str());
+ } else {
+ this->writef("%s %sPrev;\n",
+ Layout::CTypeToStr(mapper->ctype()), name.c_str());
}
}
}
@@ -751,17 +739,14 @@
void CPPCodeGenerator::writePrivateVarValues() {
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const auto& raw : decls.fVars) {
- VarDeclaration& decl = raw->as<VarDeclaration>();
- if (is_private(*decl.fVar) && decl.fValue) {
- this->writef("%s = ", String(decl.fVar->name()).c_str());
- fCPPMode = true;
- this->writeExpression(*decl.fValue, kAssignment_Precedence);
- fCPPMode = false;
- this->write(";\n");
- }
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ if (is_private(*decl.fVar) && decl.fValue) {
+ this->writef("%s = ", String(decl.fVar->name()).c_str());
+ fCPPMode = true;
+ this->writeExpression(*decl.fValue, kAssignment_Precedence);
+ fCPPMode = false;
+ this->write(";\n");
}
}
}
@@ -968,18 +953,15 @@
" (void) _outer;\n",
fFullName.c_str(), fFullName.c_str());
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const auto& raw : decls.fVars) {
- VarDeclaration& decl = raw->as<VarDeclaration>();
- String nameString(decl.fVar->name());
- const char* name = nameString.c_str();
- if (SectionAndParameterHelper::IsParameter(*decl.fVar) &&
- is_accessible(*decl.fVar)) {
- this->writef(" auto %s = _outer.%s;\n"
- " (void) %s;\n",
- name, name, name);
- }
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ String nameString(decl.fVar->name());
+ const char* name = nameString.c_str();
+ if (SectionAndParameterHelper::IsParameter(*decl.fVar) &&
+ is_accessible(*decl.fVar)) {
+ this->writef(" auto %s = _outer.%s;\n"
+ " (void) %s;\n",
+ name, name, name);
}
}
}
@@ -1084,38 +1066,35 @@
if (section) {
int samplerIndex = 0;
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const std::unique_ptr<Statement>& raw : decls.fVars) {
- const VarDeclaration& decl = raw->as<VarDeclaration>();
- const Variable& variable = *decl.fVar;
- String nameString(variable.name());
- const char* name = nameString.c_str();
- if (variable.type().typeKind() == Type::TypeKind::kSampler) {
- this->writef(" const GrSurfaceProxyView& %sView = "
- "_outer.textureSampler(%d).view();\n",
- name, samplerIndex);
- this->writef(" GrTexture& %s = *%sView.proxy()->peekTexture();\n",
- name, name);
- this->writef(" (void) %s;\n", name);
- ++samplerIndex;
- } else if (needs_uniform_var(variable)) {
- this->writef(" UniformHandle& %s = %sVar;\n"
- " (void) %s;\n",
- name, HCodeGenerator::FieldName(name).c_str(), name);
- } else if (SectionAndParameterHelper::IsParameter(variable) &&
- variable.type() != *fContext.fFragmentProcessor_Type) {
- if (!wroteProcessor) {
- this->writef(" const %s& _outer = _proc.cast<%s>();\n", fullName,
- fullName);
- wroteProcessor = true;
- }
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ const Variable& variable = *decl.fVar;
+ String nameString(variable.name());
+ const char* name = nameString.c_str();
+ if (variable.type().typeKind() == Type::TypeKind::kSampler) {
+ this->writef(" const GrSurfaceProxyView& %sView = "
+ "_outer.textureSampler(%d).view();\n",
+ name, samplerIndex);
+ this->writef(" GrTexture& %s = *%sView.proxy()->peekTexture();\n",
+ name, name);
+ this->writef(" (void) %s;\n", name);
+ ++samplerIndex;
+ } else if (needs_uniform_var(variable)) {
+ this->writef(" UniformHandle& %s = %sVar;\n"
+ " (void) %s;\n",
+ name, HCodeGenerator::FieldName(name).c_str(), name);
+ } else if (SectionAndParameterHelper::IsParameter(variable) &&
+ variable.type() != *fContext.fFragmentProcessor_Type) {
+ if (!wroteProcessor) {
+ this->writef(" const %s& _outer = _proc.cast<%s>();\n", fullName,
+ fullName);
+ wroteProcessor = true;
+ }
- if (variable.type().nonnullable() != *fContext.fFragmentProcessor_Type) {
- this->writef(" auto %s = _outer.%s;\n"
- " (void) %s;\n",
- name, name, name);
- }
+ if (variable.type().nonnullable() != *fContext.fFragmentProcessor_Type) {
+ this->writef(" auto %s = _outer.%s;\n"
+ " (void) %s;\n",
+ name, name, name);
}
}
}
@@ -1260,76 +1239,71 @@
"GrProcessorKeyBuilder* b) const {\n",
fFullName.c_str());
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const auto& raw : decls.fVars) {
- const VarDeclaration& decl = raw->as<VarDeclaration>();
- const Variable& var = *decl.fVar;
- const Type& varType = var.type();
- String nameString(var.name());
- const char* name = nameString.c_str();
- if (var.fModifiers.fLayout.fKey != Layout::kNo_Key &&
- (var.fModifiers.fFlags & Modifiers::kUniform_Flag)) {
- fErrors.error(var.fOffset,
- "layout(key) may not be specified on uniforms");
- }
- switch (var.fModifiers.fLayout.fKey) {
- case Layout::kKey_Key:
- if (is_private(var)) {
- this->writef("%s %s =",
- HCodeGenerator::FieldType(fContext, varType,
- var.fModifiers.fLayout).c_str(),
- String(var.name()).c_str());
- if (decl.fValue) {
- fCPPMode = true;
- this->writeExpression(*decl.fValue, kAssignment_Precedence);
- fCPPMode = false;
- } else {
- this->writef("%s", default_value(var).c_str());
- }
- this->write(";\n");
- }
- if (var.fModifiers.fLayout.fWhen.fLength) {
- this->writef("if (%s) {", String(var.fModifiers.fLayout.fWhen).c_str());
- }
- if (varType == *fContext.fHalf4_Type) {
- this->writef(" uint16_t red = SkFloatToHalf(%s.fR);\n",
- HCodeGenerator::FieldName(name).c_str());
- this->writef(" uint16_t green = SkFloatToHalf(%s.fG);\n",
- HCodeGenerator::FieldName(name).c_str());
- this->writef(" uint16_t blue = SkFloatToHalf(%s.fB);\n",
- HCodeGenerator::FieldName(name).c_str());
- this->writef(" uint16_t alpha = SkFloatToHalf(%s.fA);\n",
- HCodeGenerator::FieldName(name).c_str());
- this->write(" b->add32(((uint32_t)red << 16) | green);\n");
- this->write(" b->add32(((uint32_t)blue << 16) | alpha);\n");
- } else if (varType == *fContext.fHalf_Type ||
- varType == *fContext.fFloat_Type) {
- this->writef(" b->add32(sk_bit_cast<uint32_t>(%s));\n",
- HCodeGenerator::FieldName(name).c_str());
- } else if (varType.isInteger() || varType == *fContext.fBool_Type ||
- varType.typeKind() == Type::TypeKind::kEnum) {
- this->writef(" b->add32((uint32_t) %s);\n",
- HCodeGenerator::FieldName(name).c_str());
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ const Variable& var = *decl.fVar;
+ const Type& varType = var.type();
+ String nameString(var.name());
+ const char* name = nameString.c_str();
+ if (var.fModifiers.fLayout.fKey != Layout::kNo_Key &&
+ (var.fModifiers.fFlags & Modifiers::kUniform_Flag)) {
+ fErrors.error(var.fOffset, "layout(key) may not be specified on uniforms");
+ }
+ switch (var.fModifiers.fLayout.fKey) {
+ case Layout::kKey_Key:
+ if (is_private(var)) {
+ this->writef("%s %s =",
+ HCodeGenerator::FieldType(fContext, varType,
+ var.fModifiers.fLayout).c_str(),
+ String(var.name()).c_str());
+ if (decl.fValue) {
+ fCPPMode = true;
+ this->writeExpression(*decl.fValue, kAssignment_Precedence);
+ fCPPMode = false;
} else {
- ABORT("NOT YET IMPLEMENTED: automatic key handling for %s\n",
- varType.displayName().c_str());
+ this->writef("%s", default_value(var).c_str());
}
- if (var.fModifiers.fLayout.fWhen.fLength) {
- this->write("}");
- }
- break;
- case Layout::kIdentity_Key:
- if (varType.typeKind() != Type::TypeKind::kMatrix) {
- fErrors.error(var.fOffset,
- "layout(key=identity) requires matrix type");
- }
- this->writef(" b->add32(%s.isIdentity() ? 1 : 0);\n",
+ this->write(";\n");
+ }
+ if (var.fModifiers.fLayout.fWhen.fLength) {
+ this->writef("if (%s) {", String(var.fModifiers.fLayout.fWhen).c_str());
+ }
+ if (varType == *fContext.fHalf4_Type) {
+ this->writef(" uint16_t red = SkFloatToHalf(%s.fR);\n",
HCodeGenerator::FieldName(name).c_str());
- break;
- case Layout::kNo_Key:
- break;
- }
+ this->writef(" uint16_t green = SkFloatToHalf(%s.fG);\n",
+ HCodeGenerator::FieldName(name).c_str());
+ this->writef(" uint16_t blue = SkFloatToHalf(%s.fB);\n",
+ HCodeGenerator::FieldName(name).c_str());
+ this->writef(" uint16_t alpha = SkFloatToHalf(%s.fA);\n",
+ HCodeGenerator::FieldName(name).c_str());
+ this->write(" b->add32(((uint32_t)red << 16) | green);\n");
+ this->write(" b->add32(((uint32_t)blue << 16) | alpha);\n");
+ } else if (varType == *fContext.fHalf_Type ||
+ varType == *fContext.fFloat_Type) {
+ this->writef(" b->add32(sk_bit_cast<uint32_t>(%s));\n",
+ HCodeGenerator::FieldName(name).c_str());
+ } else if (varType.isInteger() || varType == *fContext.fBool_Type ||
+ varType.typeKind() == Type::TypeKind::kEnum) {
+ this->writef(" b->add32((uint32_t) %s);\n",
+ HCodeGenerator::FieldName(name).c_str());
+ } else {
+ ABORT("NOT YET IMPLEMENTED: automatic key handling for %s\n",
+ varType.displayName().c_str());
+ }
+ if (var.fModifiers.fLayout.fWhen.fLength) {
+ this->write("}");
+ }
+ break;
+ case Layout::kIdentity_Key:
+ if (varType.typeKind() != Type::TypeKind::kMatrix) {
+ fErrors.error(var.fOffset, "layout(key=identity) requires matrix type");
+ }
+ this->writef(" b->add32(%s.isIdentity() ? 1 : 0);\n",
+ HCodeGenerator::FieldName(name).c_str());
+ break;
+ case Layout::kNo_Key:
+ break;
}
}
}
@@ -1339,39 +1313,36 @@
bool CPPCodeGenerator::generateCode() {
std::vector<const Variable*> uniforms;
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const auto& raw : decls.fVars) {
- VarDeclaration& decl = raw->as<VarDeclaration>();
- if ((decl.fVar->fModifiers.fFlags & Modifiers::kUniform_Flag) &&
- decl.fVar->type().typeKind() != Type::TypeKind::kSampler) {
- uniforms.push_back(decl.fVar);
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ if ((decl.fVar->fModifiers.fFlags & Modifiers::kUniform_Flag) &&
+ decl.fVar->type().typeKind() != Type::TypeKind::kSampler) {
+ uniforms.push_back(decl.fVar);
+ }
+
+ if (is_uniform_in(*decl.fVar)) {
+ // Validate the "uniform in" declarations to make sure they are fully supported,
+ // instead of generating surprising C++
+ const UniformCTypeMapper* mapper =
+ UniformCTypeMapper::Get(fContext, *decl.fVar);
+ if (mapper == nullptr) {
+ fErrors.error(decl.fOffset, String(decl.fVar->name())
+ + "'s type is not supported for use as a 'uniform in'");
+ return false;
+ }
+ if (decl.fVar->fModifiers.fLayout.fFlags & Layout::kTracked_Flag) {
+ if (!mapper->supportsTracking()) {
+ fErrors.error(decl.fOffset, String(decl.fVar->name())
+ + "'s type does not support state tracking");
+ return false;
+ }
}
- if (is_uniform_in(*decl.fVar)) {
- // Validate the "uniform in" declarations to make sure they are fully supported,
- // instead of generating surprising C++
- const UniformCTypeMapper* mapper =
- UniformCTypeMapper::Get(fContext, *decl.fVar);
- if (mapper == nullptr) {
- fErrors.error(decl.fOffset, String(decl.fVar->name())
- + "'s type is not supported for use as a 'uniform in'");
- return false;
- }
- if (decl.fVar->fModifiers.fLayout.fFlags & Layout::kTracked_Flag) {
- if (!mapper->supportsTracking()) {
- fErrors.error(decl.fOffset, String(decl.fVar->name())
- + "'s type does not support state tracking");
- return false;
- }
- }
-
- } else {
- // If it's not a uniform_in, it's an error to be tracked
- if (decl.fVar->fModifiers.fLayout.fFlags & Layout::kTracked_Flag) {
- fErrors.error(decl.fOffset, "Non-'in uniforms' cannot be tracked");
- return false;
- }
+ } else {
+ // If it's not a uniform_in, it's an error to be tracked
+ if (decl.fVar->fModifiers.fLayout.fFlags & Layout::kTracked_Flag) {
+ fErrors.error(decl.fOffset, "Non-'in uniforms' cannot be tracked");
+ return false;
}
}
}
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index db34be8..55f5c25 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -89,13 +89,9 @@
iter = src->erase(iter);
break;
}
- case ProgramElement::Kind::kVar: {
- // TODO: For now, we only support one variable per declaration. We map names to
- // declarations, and each declaration pulls in all of it's variables, so this rule
- // ensures that we never pull in variables that aren't actually used.
- const VarDeclarations& vd = element->as<VarDeclarations>();
- SkASSERT(vd.fVars.size() == 1);
- const Variable* var = vd.fVars[0]->as<VarDeclaration>().fVar;
+ case ProgramElement::Kind::kGlobalVar: {
+ const GlobalVarDeclaration& vd = element->as<GlobalVarDeclaration>();
+ const Variable* var = vd.fDecl->fVar;
target->insertOrDie(var->name(), std::move(element));
iter = src->erase(iter);
break;
@@ -599,13 +595,8 @@
for (const auto& node : block.fNodes) {
if (node.isStatement()) {
const Statement* s = node.statement()->get();
- if (s->is<VarDeclarationsStatement>()) {
- const VarDeclarationsStatement* vd = &s->as<VarDeclarationsStatement>();
- for (const auto& decl : vd->fDeclaration->fVars) {
- if (decl->kind() == Statement::Kind::kVarDeclaration) {
- result[decl->as<VarDeclaration>().fVar] = nullptr;
- }
- }
+ if (s->is<VarDeclaration>()) {
+ result[s->as<VarDeclaration>().fVar] = nullptr;
}
}
}
@@ -1495,21 +1486,7 @@
// Block was reachable before optimization, but has since become unreachable. In
// addition to being dead code, it's broken - since control flow can't reach it, no
// prior variable definitions can reach it, and therefore variables might look to
- // have not been properly assigned. Kill it.
-
- // We need to do this in two steps. For any variable declarations, the node list
- // will contain statement nodes for each VarDeclaration, and then a statement for
- // the VarDeclarationsStatement. When we replace the VDS with a Nop, we delete the
- // storage of the unique_ptr that the VD nodes are pointing to. So we remove those
- // from the node list entirely, first.
- b.fNodes.erase(std::remove_if(b.fNodes.begin(), b.fNodes.end(),
- [](const BasicBlock::Node& node) {
- return node.isStatement() &&
- (*node.statement())->is<VarDeclaration>();
- }),
- b.fNodes.end());
-
- // Now replace any remaining statements in the block with Nops.
+ // have not been properly assigned. Kill it by replacing all statements with Nops.
for (BasicBlock::Node& node : b.fNodes) {
if (node.isStatement() && !(*node.statement())->is<Nop>()) {
node.setStatement(std::make_unique<Nop>());
@@ -1565,23 +1542,6 @@
}
++iter;
break;
- case Statement::Kind::kVarDeclarations: {
- VarDeclarations& decls = *s.as<VarDeclarationsStatement>().fDeclaration;
- decls.fVars.erase(
- std::remove_if(decls.fVars.begin(), decls.fVars.end(),
- [&](const std::unique_ptr<Statement>& var) {
- bool nop = var->is<Nop>();
- madeChanges |= nop;
- return nop;
- }),
- decls.fVars.end());
- if (decls.fVars.empty()) {
- iter = b.fNodes.erase(iter);
- } else {
- ++iter;
- }
- break;
- }
default:
++iter;
break;
@@ -1717,30 +1677,15 @@
}
if (program.fKind != Program::kFragmentProcessor_Kind) {
- // Remove dead variables.
- for (ProgramElement& element : program) {
- if (!element.is<VarDeclarations>()) {
- continue;
- }
- VarDeclarations& vars = element.as<VarDeclarations>();
- vars.fVars.erase(
- std::remove_if(vars.fVars.begin(), vars.fVars.end(),
- [&](const std::unique_ptr<Statement>& stmt) {
- bool dead = stmt->as<VarDeclaration>().fVar->dead();
- madeChanges |= dead;
- return dead;
- }),
- vars.fVars.end());
- }
-
- // Remove empty variable declarations with no variables left inside of them.
+ // Remove declarations of dead global variables
program.fElements.erase(
std::remove_if(program.fElements.begin(), program.fElements.end(),
[&](const std::unique_ptr<ProgramElement>& element) {
- if (!element->is<VarDeclarations>()) {
+ if (!element->is<GlobalVarDeclaration>()) {
return false;
}
- bool dead = element->as<VarDeclarations>().fVars.empty();
+ const auto& varDecl = element->as<GlobalVarDeclaration>();
+ bool dead = varDecl.fDecl->fVar->dead();
madeChanges |= dead;
return dead;
}),
diff --git a/src/sksl/SkSLDehydrator.cpp b/src/sksl/SkSLDehydrator.cpp
index ec039d8..c2619ec 100644
--- a/src/sksl/SkSLDehydrator.cpp
+++ b/src/sksl/SkSLDehydrator.cpp
@@ -45,7 +45,6 @@
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLUnresolvedFunction.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
@@ -489,6 +488,7 @@
const VarDeclaration& v = s->as<VarDeclaration>();
this->writeU8(Rehydrator::kVarDeclaration_Command);
this->writeU16(this->symbolId(v.fVar));
+ this->write(v.fBaseType);
this->writeU8(v.fSizes.size());
for (const std::unique_ptr<Expression>& sizeExpr : v.fSizes) {
this->write(sizeExpr.get());
@@ -496,11 +496,6 @@
this->write(v.fValue.get());
break;
}
- case Statement::Kind::kVarDeclarations: {
- const VarDeclarationsStatement& v = s->as<VarDeclarationsStatement>();
- this->write(*v.fDeclaration);
- break;
- }
case Statement::Kind::kWhile: {
const WhileStatement& w = s->as<WhileStatement>();
this->writeU8(Rehydrator::kWhile_Command);
@@ -566,14 +561,10 @@
case ProgramElement::Kind::kSection:
SkASSERT(false);
break;
- case ProgramElement::Kind::kVar: {
- const VarDeclarations& v = e.as<VarDeclarations>();
+ case ProgramElement::Kind::kGlobalVar: {
+ const GlobalVarDeclaration& v = e.as<GlobalVarDeclaration>();
this->writeU8(Rehydrator::kVarDeclarations_Command);
- this->write(v.fBaseType);
- this->writeU8(v.fVars.size());
- for (const auto& var : v.fVars) {
- this->write(var.get());
- }
+ this->write(v.fDecl.get());
break;
}
}
diff --git a/src/sksl/SkSLGLSLCodeGenerator.cpp b/src/sksl/SkSLGLSLCodeGenerator.cpp
index f0f7b7d..66452fd 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/SkSLGLSLCodeGenerator.cpp
@@ -1244,51 +1244,36 @@
this->write(this->getTypePrecision(type));
}
-void GLSLCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, bool global) {
- if (!decl.fVars.size()) {
- return;
+void GLSLCodeGenerator::writeVarDeclaration(const VarDeclaration& var, bool global) {
+ this->writeModifiers(var.fVar->fModifiers, global);
+ this->writeTypePrecision(var.fBaseType);
+ this->writeType(var.fBaseType);
+ this->write(" ");
+ this->write(var.fVar->name());
+ for (const auto& size : var.fSizes) {
+ this->write("[");
+ if (size) {
+ this->writeExpression(*size, kTopLevel_Precedence);
+ }
+ this->write("]");
}
- bool wroteType = false;
- for (const auto& stmt : decl.fVars) {
- const VarDeclaration& var = stmt->as<VarDeclaration>();
- if (wroteType) {
- this->write(", ");
- } else {
- this->writeModifiers(var.fVar->fModifiers, global);
- this->writeTypePrecision(decl.fBaseType);
- this->writeType(decl.fBaseType);
- this->write(" ");
- wroteType = true;
- }
- this->write(var.fVar->name());
- for (const auto& size : var.fSizes) {
- this->write("[");
- if (size) {
- this->writeExpression(*size, kTopLevel_Precedence);
- }
- this->write("]");
- }
- if (var.fValue) {
- this->write(" = ");
- this->writeVarInitializer(*var.fVar, *var.fValue);
- }
- if (!fFoundExternalSamplerDecl && var.fVar->type() == *fContext.fSamplerExternalOES_Type) {
- if (fProgram.fSettings.fCaps->externalTextureExtensionString()) {
- this->writeExtension(fProgram.fSettings.fCaps->externalTextureExtensionString());
- }
- if (fProgram.fSettings.fCaps->secondExternalTextureExtensionString()) {
- this->writeExtension(
- fProgram.fSettings.fCaps->secondExternalTextureExtensionString());
- }
- fFoundExternalSamplerDecl = true;
- }
- if (!fFoundRectSamplerDecl && var.fVar->type() == *fContext.fSampler2DRect_Type) {
- fFoundRectSamplerDecl = true;
- }
+ if (var.fValue) {
+ this->write(" = ");
+ this->writeVarInitializer(*var.fVar, *var.fValue);
}
- if (wroteType) {
- this->write(";");
+ if (!fFoundExternalSamplerDecl && var.fVar->type() == *fContext.fSamplerExternalOES_Type) {
+ if (fProgram.fSettings.fCaps->externalTextureExtensionString()) {
+ this->writeExtension(fProgram.fSettings.fCaps->externalTextureExtensionString());
+ }
+ if (fProgram.fSettings.fCaps->secondExternalTextureExtensionString()) {
+ this->writeExtension(fProgram.fSettings.fCaps->secondExternalTextureExtensionString());
+ }
+ fFoundExternalSamplerDecl = true;
}
+ if (!fFoundRectSamplerDecl && var.fVar->type() == *fContext.fSampler2DRect_Type) {
+ fFoundRectSamplerDecl = true;
+ }
+ this->write(";");
}
void GLSLCodeGenerator::writeStatement(const Statement& s) {
@@ -1303,8 +1288,8 @@
case Statement::Kind::kReturn:
this->writeReturnStatement(s.as<ReturnStatement>());
break;
- case Statement::Kind::kVarDeclarations:
- this->writeVarDeclarations(*s.as<VarDeclarationsStatement>().fDeclaration, false);
+ case Statement::Kind::kVarDeclaration:
+ this->writeVarDeclaration(s.as<VarDeclaration>(), false);
break;
case Statement::Kind::kIf:
this->writeIfStatement(s.as<IfStatement>());
@@ -1500,27 +1485,25 @@
case ProgramElement::Kind::kExtension:
this->writeExtension(e.as<Extension>().name());
break;
- case ProgramElement::Kind::kVar: {
- const VarDeclarations& decl = e.as<VarDeclarations>();
- if (decl.fVars.size() > 0) {
- int builtin = decl.fVars[0]->as<VarDeclaration>().fVar->fModifiers.fLayout.fBuiltin;
- if (builtin == -1) {
- // normal var
- this->writeVarDeclarations(decl, true);
- this->writeLine();
- } else if (builtin == SK_FRAGCOLOR_BUILTIN &&
- fProgram.fSettings.fCaps->mustDeclareFragmentShaderOutput() &&
- decl.fVars[0]->as<VarDeclaration>().fVar->fWriteCount) {
- if (fProgram.fSettings.fFragColorIsInOut) {
- this->write("inout ");
- } else {
- this->write("out ");
- }
- if (usesPrecisionModifiers()) {
- this->write("mediump ");
- }
- this->writeLine("vec4 sk_FragColor;");
+ case ProgramElement::Kind::kGlobalVar: {
+ const VarDeclaration& decl = *e.as<GlobalVarDeclaration>().fDecl;
+ int builtin = decl.fVar->fModifiers.fLayout.fBuiltin;
+ if (builtin == -1) {
+ // normal var
+ this->writeVarDeclaration(decl, true);
+ this->writeLine();
+ } else if (builtin == SK_FRAGCOLOR_BUILTIN &&
+ fProgram.fSettings.fCaps->mustDeclareFragmentShaderOutput() &&
+ decl.fVar->fWriteCount) {
+ if (fProgram.fSettings.fFragColorIsInOut) {
+ this->write("inout ");
+ } else {
+ this->write("out ");
}
+ if (usesPrecisionModifiers()) {
+ this->write("mediump ");
+ }
+ this->writeLine("vec4 sk_FragColor;");
}
break;
}
diff --git a/src/sksl/SkSLGLSLCodeGenerator.h b/src/sksl/SkSLGLSLCodeGenerator.h
index 9a4c5c7..31683dd 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.h
+++ b/src/sksl/SkSLGLSLCodeGenerator.h
@@ -39,7 +39,6 @@
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariableReference.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
@@ -127,7 +126,7 @@
void writeTypePrecision(const Type& type);
- void writeVarDeclarations(const VarDeclarations& decl, bool global);
+ void writeVarDeclaration(const VarDeclaration& var, bool global);
void writeFragCoord();
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index 2d94b7f..e883af8 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -52,7 +52,6 @@
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLUnresolvedFunction.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/ir/SkSLVariableReference.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
@@ -293,23 +292,28 @@
std::unique_ptr<Statement> IRGenerator::convertVarDeclarationStatement(const ASTNode& s) {
SkASSERT(s.fKind == ASTNode::Kind::kVarDeclarations);
- auto decl = this->convertVarDeclarations(s, Variable::kLocal_Storage);
- if (!decl) {
+ auto decls = this->convertVarDeclarations(s, Variable::kLocal_Storage);
+ if (decls.empty()) {
return nullptr;
}
- return std::unique_ptr<Statement>(new VarDeclarationsStatement(std::move(decl)));
+ if (decls.size() == 1) {
+ return std::move(decls.front());
+ } else {
+ return std::make_unique<Block>(s.fOffset, std::move(decls), /*symbols=*/nullptr,
+ /*isScope=*/false);
+ }
}
-std::unique_ptr<VarDeclarations> IRGenerator::convertVarDeclarations(const ASTNode& decls,
- Variable::Storage storage) {
+std::vector<std::unique_ptr<Statement>> IRGenerator::convertVarDeclarations(
+ const ASTNode& decls, Variable::Storage storage) {
SkASSERT(decls.fKind == ASTNode::Kind::kVarDeclarations);
auto declarationsIter = decls.begin();
const Modifiers& modifiers = declarationsIter++->getModifiers();
const ASTNode& rawType = *(declarationsIter++);
- std::vector<std::unique_ptr<Statement>> variables;
+ std::vector<std::unique_ptr<Statement>> varDecls;
const Type* baseType = this->convertType(rawType);
if (!baseType) {
- return nullptr;
+ return {};
}
if (baseType->nonnullable() == *fContext.fFragmentProcessor_Type &&
storage != Variable::kGlobal_Storage) {
@@ -416,7 +420,7 @@
if (rawSize) {
auto size = this->coerce(this->convertExpression(rawSize), *fContext.fInt_Type);
if (!size) {
- return nullptr;
+ return {};
}
String name(type->name());
int64_t count;
@@ -424,12 +428,12 @@
count = size->as<IntLiteral>().value();
if (count <= 0) {
fErrors.error(size->fOffset, "array size must be positive");
- return nullptr;
+ return {};
}
name += "[" + to_string(count) + "]";
} else {
fErrors.error(size->fOffset, "array size must be specified");
- return nullptr;
+ return {};
}
type = fSymbolTable->takeOwnershipOfSymbol(
std::make_unique<Type>(name, Type::TypeKind::kArray, *type, (int)count));
@@ -451,11 +455,11 @@
if (iter != varDecl.end()) {
value = this->convertExpression(*iter);
if (!value) {
- return nullptr;
+ return {};
}
value = this->coerce(std::move(value), *type);
if (!value) {
- return nullptr;
+ return {};
}
var->fWriteCount = 1;
var->fInitialValue = value.get();
@@ -469,13 +473,13 @@
// Already defined, just update the modifiers.
symbol->as<Variable>().fModifiers = var->fModifiers;
} else {
- variables.emplace_back(std::make_unique<VarDeclaration>(var.get(), std::move(sizes),
- std::move(value)));
+ varDecls.emplace_back(std::make_unique<VarDeclaration>(
+ var.get(), baseType, std::move(sizes), std::move(value)));
StringFragment name = var->name();
fSymbolTable->add(name, std::move(var));
}
}
- return std::make_unique<VarDeclarations>(decls.fOffset, baseType, std::move(variables));
+ return varDecls;
}
std::unique_ptr<ModifiersDeclaration> IRGenerator::convertModifiersDeclaration(const ASTNode& m) {
@@ -1119,18 +1123,17 @@
bool foundRTAdjust = false;
auto iter = intf.begin();
for (size_t i = 0; i < id.fDeclarationCount; ++i) {
- std::unique_ptr<VarDeclarations> decl = this->convertVarDeclarations(
- *(iter++),
- Variable::kInterfaceBlock_Storage);
- if (!decl) {
+ std::vector<std::unique_ptr<Statement>> decls =
+ this->convertVarDeclarations(*(iter++), Variable::kInterfaceBlock_Storage);
+ if (decls.empty()) {
return nullptr;
}
- for (const auto& stmt : decl->fVars) {
- VarDeclaration& vd = stmt->as<VarDeclaration>();
+ for (const auto& decl : decls) {
+ const VarDeclaration& vd = decl->as<VarDeclaration>();
if (haveRuntimeArray) {
fErrors.error(decl->fOffset,
- "only the last entry in an interface block may be a runtime-sized "
- "array");
+ "only the last entry in an interface block may be a runtime-sized "
+ "array");
}
if (vd.fVar == fRTAdjust) {
foundRTAdjust = true;
@@ -1138,10 +1141,10 @@
fRTAdjustFieldIndex = fields.size();
}
fields.push_back(Type::Field(vd.fVar->fModifiers, vd.fVar->name(),
- &vd.fVar->type()));
+ &vd.fVar->type()));
if (vd.fValue) {
fErrors.error(decl->fOffset,
- "initializers are not permitted on interface block fields");
+ "initializers are not permitted on interface block fields");
}
if (vd.fVar->type().typeKind() == Type::TypeKind::kArray &&
vd.fVar->type().columns() == Type::kUnsizedArray) {
@@ -2845,17 +2848,15 @@
// the corresponding ProgramElement.
if (const ProgramElement* sharedDecls =
fGenerator->fIntrinsics->findAndInclude(name)) {
- SkASSERT(sharedDecls->is<VarDeclarations>());
+ SkASSERT(sharedDecls->is<GlobalVarDeclaration>());
- // Clone the VarDeclarations ProgramElement that declares this variable
+ // Clone the GlobalVarDeclaration ProgramElement that declares this variable
std::unique_ptr<ProgramElement> clonedDecls = sharedDecls->clone();
- VarDeclarations& varDecls = clonedDecls->as<VarDeclarations>();
- SkASSERT(varDecls.fVars.size() == 1);
- VarDeclaration& varDecl = varDecls.fVars.front()->as<VarDeclaration>();
+ VarDeclaration& varDecl = *clonedDecls->as<GlobalVarDeclaration>().fDecl;
const Variable* sharedVar = varDecl.fVar;
// Now clone the Variable, and add the clone to the Program's symbol table.
- // Any initial value expression was cloned as part of the VarDeclarations,
+ // Any initial value expression was cloned as part of the GlobalVarDeclaration,
// so we're pointing at a Program-owned expression.
const Variable* clonedVar =
fGenerator->fSymbolTable->takeOwnershipOfSymbol(std::make_unique<Variable>(
@@ -2869,7 +2870,7 @@
// Remember this new re-mapping...
fRemap.insert({sharedVar, clonedVar});
- // Add the VarDeclarations to this Program
+ // Add the GlobalVarDeclaration to this Program
fNewElements.push_back(std::move(clonedDecls));
}
}
@@ -2935,11 +2936,11 @@
for (const auto& decl : fFile->root()) {
switch (decl.fKind) {
case ASTNode::Kind::kVarDeclarations: {
- std::unique_ptr<VarDeclarations> s = this->convertVarDeclarations(
- decl,
- Variable::kGlobal_Storage);
- if (s) {
- fProgramElements->push_back(std::move(s));
+ std::vector<std::unique_ptr<Statement>> decls =
+ this->convertVarDeclarations(decl, Variable::kGlobal_Storage);
+ for (auto& varDecl : decls) {
+ fProgramElements->push_back(std::make_unique<GlobalVarDeclaration>(
+ decl.fOffset, std::move(varDecl)));
}
break;
}
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index db24930..9ba9e77 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -127,8 +127,8 @@
void popSymbolTable();
void checkModifiers(int offset, const Modifiers& modifiers, int permitted);
- std::unique_ptr<VarDeclarations> convertVarDeclarations(const ASTNode& decl,
- Variable::Storage storage);
+ std::vector<std::unique_ptr<Statement>> convertVarDeclarations(const ASTNode& decl,
+ Variable::Storage storage);
void convertFunction(const ASTNode& f);
std::unique_ptr<Statement> convertSingleStatement(const ASTNode& statement);
std::unique_ptr<Statement> convertStatement(const ASTNode& statement);
diff --git a/src/sksl/SkSLInliner.cpp b/src/sksl/SkSLInliner.cpp
index 26e6e98..5b3fb4e 100644
--- a/src/sksl/SkSLInliner.cpp
+++ b/src/sksl/SkSLInliner.cpp
@@ -49,7 +49,6 @@
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLUnresolvedFunction.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/ir/SkSLVariableReference.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
@@ -547,6 +546,7 @@
auto name = std::make_unique<String>(
this->uniqueNameForInlineVar(String(old->name()), symbolTableForStatement));
const String* namePtr = symbolTableForStatement->takeOwnershipOfString(std::move(name));
+ const Type* baseTypePtr = copy_if_needed(&decl.fBaseType, *symbolTableForStatement);
const Type* typePtr = copy_if_needed(&old->type(), *symbolTableForStatement);
const Variable* clone = symbolTableForStatement->takeOwnershipOfSymbol(
std::make_unique<Variable>(offset,
@@ -557,20 +557,9 @@
old->fStorage,
initialValue.get()));
(*varMap)[old] = std::make_unique<VariableReference>(offset, clone);
- return std::make_unique<VarDeclaration>(clone, std::move(sizes),
+ return std::make_unique<VarDeclaration>(clone, baseTypePtr, std::move(sizes),
std::move(initialValue));
}
- case Statement::Kind::kVarDeclarations: {
- const VarDeclarations& decls = *statement.as<VarDeclarationsStatement>().fDeclaration;
- std::vector<std::unique_ptr<Statement>> vars;
- vars.reserve(decls.fVars.size());
- for (const auto& var : decls.fVars) {
- vars.push_back(stmt(var));
- }
- const Type* typePtr = copy_if_needed(&decls.fBaseType, *symbolTableForStatement);
- return std::unique_ptr<Statement>(new VarDeclarationsStatement(
- std::make_unique<VarDeclarations>(offset, typePtr, std::move(vars))));
- }
case Statement::Kind::kWhile: {
const WhileStatement& w = statement.as<WhileStatement>();
return std::make_unique<WhileStatement>(offset, expr(w.fTest), stmt(w.fStatement));
@@ -646,20 +635,19 @@
// Prepare the variable declaration (taking extra care with `out` params to not clobber any
// initial value).
- std::vector<std::unique_ptr<Statement>> variables;
+ std::unique_ptr<Statement> variable;
if (initialValue && (modifiers.fFlags & Modifiers::kOut_Flag)) {
- variables.push_back(std::make_unique<VarDeclaration>(
- variableSymbol, /*sizes=*/std::vector<std::unique_ptr<Expression>>{},
- (*initialValue)->clone()));
+ variable = std::make_unique<VarDeclaration>(
+ variableSymbol, type, /*sizes=*/std::vector<std::unique_ptr<Expression>>{},
+ (*initialValue)->clone());
} else {
- variables.push_back(std::make_unique<VarDeclaration>(
- variableSymbol, /*sizes=*/std::vector<std::unique_ptr<Expression>>{},
- std::move(*initialValue)));
+ variable = std::make_unique<VarDeclaration>(
+ variableSymbol, type, /*sizes=*/std::vector<std::unique_ptr<Expression>>{},
+ std::move(*initialValue));
}
// Add the new variable-declaration statement to our block of extra statements.
- inlinedBody.children().push_back(std::make_unique<VarDeclarationsStatement>(
- std::make_unique<VarDeclarations>(offset, type, std::move(variables))));
+ inlinedBody.children().push_back(std::move(variable));
return std::make_unique<VariableReference>(offset, variableSymbol);
};
@@ -943,13 +931,6 @@
this->visitExpression(&varDeclStmt.fValue);
break;
}
- case Statement::Kind::kVarDeclarations: {
- VarDeclarationsStatement& varDecls = (*stmt)->as<VarDeclarationsStatement>();
- for (std::unique_ptr<Statement>& varDecl : varDecls.fDeclaration->fVars) {
- this->visitStatement(&varDecl, /*isViableAsEnclosingStatement=*/false);
- }
- break;
- }
case Statement::Kind::kWhile: {
WhileStatement& whileStmt = (*stmt)->as<WhileStatement>();
// The loop body is a candidate for inlining.
diff --git a/src/sksl/SkSLMetalCodeGenerator.cpp b/src/sksl/SkSLMetalCodeGenerator.cpp
index d510af3..2ef5451 100644
--- a/src/sksl/SkSLMetalCodeGenerator.cpp
+++ b/src/sksl/SkSLMetalCodeGenerator.cpp
@@ -951,36 +951,31 @@
to_string(fUniformBuffer) + ")]]");
}
for (const auto& e : fProgram) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = e.as<VarDeclarations>();
- if (!decls.fVars.size()) {
- continue;
- }
- for (const auto& stmt: decls.fVars) {
- VarDeclaration& var = stmt->as<VarDeclaration>();
- if (var.fVar->type().typeKind() == Type::TypeKind::kSampler) {
- if (var.fVar->fModifiers.fLayout.fBinding < 0) {
- fErrors.error(decls.fOffset,
- "Metal samplers must have 'layout(binding=...)'");
- return;
- }
- if (var.fVar->type().dimensions() != SpvDim2D) {
- // TODO: Support other texture types (skbug.com/10797)
- fErrors.error(decls.fOffset, "Unsupported texture dimensions");
- return;
- }
- this->write(", texture2d<float> ");
- this->writeName(var.fVar->name());
- this->write("[[texture(");
- this->write(to_string(var.fVar->fModifiers.fLayout.fBinding));
- this->write(")]]");
- this->write(", sampler ");
- this->writeName(var.fVar->name());
- this->write(SAMPLER_SUFFIX);
- this->write("[[sampler(");
- this->write(to_string(var.fVar->fModifiers.fLayout.fBinding));
- this->write(")]]");
+ if (e.is<GlobalVarDeclaration>()) {
+ const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+ const VarDeclaration& var = *decls.fDecl;
+ if (var.fVar->type().typeKind() == Type::TypeKind::kSampler) {
+ if (var.fVar->fModifiers.fLayout.fBinding < 0) {
+ fErrors.error(decls.fOffset,
+ "Metal samplers must have 'layout(binding=...)'");
+ return;
}
+ if (var.fVar->type().dimensions() != SpvDim2D) {
+ // TODO: Support other texture types (skbug.com/10797)
+ fErrors.error(decls.fOffset, "Unsupported texture dimensions");
+ return;
+ }
+ this->write(", texture2d<float> ");
+ this->writeName(var.fVar->name());
+ this->write("[[texture(");
+ this->write(to_string(var.fVar->fModifiers.fLayout.fBinding));
+ this->write(")]]");
+ this->write(", sampler ");
+ this->writeName(var.fVar->name());
+ this->write(SAMPLER_SUFFIX);
+ this->write("[[sampler(");
+ this->write(to_string(var.fVar->fModifiers.fLayout.fBinding));
+ this->write(")]]");
}
} else if (e.kind() == ProgramElement::Kind::kInterfaceBlock) {
InterfaceBlock& intf = (InterfaceBlock&) e;
@@ -1219,38 +1214,26 @@
this->write(name);
}
-void MetalCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, bool global) {
- SkASSERT(decl.fVars.size() > 0);
- bool wroteType = false;
- for (const auto& stmt : decl.fVars) {
- VarDeclaration& var = (VarDeclaration&) *stmt;
- if (global && !(var.fVar->fModifiers.fFlags & Modifiers::kConst_Flag)) {
- continue;
- }
- if (wroteType) {
- this->write(", ");
- } else {
- this->writeModifiers(var.fVar->fModifiers, global);
- this->writeType(decl.fBaseType);
- this->write(" ");
- wroteType = true;
- }
- this->writeName(var.fVar->name());
- for (const auto& size : var.fSizes) {
- this->write("[");
- if (size) {
- this->writeExpression(*size, kTopLevel_Precedence);
- }
- this->write("]");
- }
- if (var.fValue) {
- this->write(" = ");
- this->writeVarInitializer(*var.fVar, *var.fValue);
- }
+void MetalCodeGenerator::writeVarDeclaration(const VarDeclaration& var, bool global) {
+ if (global && !(var.fVar->fModifiers.fFlags & Modifiers::kConst_Flag)) {
+ return;
}
- if (wroteType) {
- this->write(";");
+ this->writeModifiers(var.fVar->fModifiers, global);
+ this->writeType(var.fBaseType);
+ this->write(" ");
+ this->writeName(var.fVar->name());
+ for (const auto& size : var.fSizes) {
+ this->write("[");
+ if (size) {
+ this->writeExpression(*size, kTopLevel_Precedence);
+ }
+ this->write("]");
}
+ if (var.fValue) {
+ this->write(" = ");
+ this->writeVarInitializer(*var.fVar, *var.fValue);
+ }
+ this->write(";");
}
void MetalCodeGenerator::writeStatement(const Statement& s) {
@@ -1265,8 +1248,8 @@
case Statement::Kind::kReturn:
this->writeReturnStatement(s.as<ReturnStatement>());
break;
- case Statement::Kind::kVarDeclarations:
- this->writeVarDeclarations(*s.as<VarDeclarationsStatement>().fDeclaration, false);
+ case Statement::Kind::kVarDeclaration:
+ this->writeVarDeclaration(s.as<VarDeclaration>(), false);
break;
case Statement::Kind::kIf:
this->writeIfStatement(s.as<IfStatement>());
@@ -1407,33 +1390,27 @@
void MetalCodeGenerator::writeUniformStruct() {
for (const auto& e : fProgram) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = e.as<VarDeclarations>();
- if (!decls.fVars.size()) {
- continue;
- }
- const Variable& first = *decls.fVars[0]->as<VarDeclaration>().fVar;
- if (first.fModifiers.fFlags & Modifiers::kUniform_Flag &&
- first.type().typeKind() != Type::TypeKind::kSampler) {
+ if (e.is<GlobalVarDeclaration>()) {
+ const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+ const Variable& var = *decls.fDecl->fVar;
+ if (var.fModifiers.fFlags & Modifiers::kUniform_Flag &&
+ var.type().typeKind() != Type::TypeKind::kSampler) {
if (-1 == fUniformBuffer) {
this->write("struct Uniforms {\n");
- fUniformBuffer = first.fModifiers.fLayout.fSet;
+ fUniformBuffer = var.fModifiers.fLayout.fSet;
if (-1 == fUniformBuffer) {
fErrors.error(decls.fOffset, "Metal uniforms must have 'layout(set=...)'");
}
- } else if (first.fModifiers.fLayout.fSet != fUniformBuffer) {
+ } else if (var.fModifiers.fLayout.fSet != fUniformBuffer) {
if (-1 == fUniformBuffer) {
fErrors.error(decls.fOffset, "Metal backend requires all uniforms to have "
"the same 'layout(set=...)'");
}
}
this->write(" ");
- this->writeType(first.type());
+ this->writeType(var.type());
this->write(" ");
- for (const auto& stmt : decls.fVars) {
- const VarDeclaration& var = stmt->as<VarDeclaration>();
- this->writeName(var.fVar->name());
- }
+ this->writeName(var.name());
this->write(";\n");
}
}
@@ -1446,28 +1423,22 @@
void MetalCodeGenerator::writeInputStruct() {
this->write("struct Inputs {\n");
for (const auto& e : fProgram) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = e.as<VarDeclarations>();
- if (!decls.fVars.size()) {
- continue;
- }
- const Variable& first = *decls.fVars[0]->as<VarDeclaration>().fVar;
- if (first.fModifiers.fFlags & Modifiers::kIn_Flag &&
- -1 == first.fModifiers.fLayout.fBuiltin) {
+ if (e.is<GlobalVarDeclaration>()) {
+ const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+ const Variable& var = *decls.fDecl->fVar;
+ if (var.fModifiers.fFlags & Modifiers::kIn_Flag &&
+ -1 == var.fModifiers.fLayout.fBuiltin) {
this->write(" ");
- this->writeType(first.type());
+ this->writeType(var.type());
this->write(" ");
- for (const auto& stmt : decls.fVars) {
- const VarDeclaration& var = stmt->as<VarDeclaration>();
- this->writeName(var.fVar->name());
- if (-1 != var.fVar->fModifiers.fLayout.fLocation) {
- if (fProgram.fKind == Program::kVertex_Kind) {
- this->write(" [[attribute(" +
- to_string(var.fVar->fModifiers.fLayout.fLocation) + ")]]");
- } else if (fProgram.fKind == Program::kFragment_Kind) {
- this->write(" [[user(locn" +
- to_string(var.fVar->fModifiers.fLayout.fLocation) + ")]]");
- }
+ this->writeName(var.name());
+ if (-1 != var.fModifiers.fLayout.fLocation) {
+ if (fProgram.fKind == Program::kVertex_Kind) {
+ this->write(" [[attribute(" +
+ to_string(var.fModifiers.fLayout.fLocation) + ")]]");
+ } else if (fProgram.fKind == Program::kFragment_Kind) {
+ this->write(" [[user(locn" +
+ to_string(var.fModifiers.fLayout.fLocation) + ")]]");
}
}
this->write(";\n");
@@ -1485,32 +1456,26 @@
this->write(" float4 sk_FragColor [[color(0)]];\n");
}
for (const auto& e : fProgram) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = e.as<VarDeclarations>();
- if (!decls.fVars.size()) {
- continue;
- }
- const Variable& first = *decls.fVars[0]->as<VarDeclaration>().fVar;
- if (first.fModifiers.fFlags & Modifiers::kOut_Flag &&
- -1 == first.fModifiers.fLayout.fBuiltin) {
+ if (e.is<GlobalVarDeclaration>()) {
+ const GlobalVarDeclaration& decls = e.as<GlobalVarDeclaration>();
+ const Variable& var = *decls.fDecl->fVar;
+ if (var.fModifiers.fFlags & Modifiers::kOut_Flag &&
+ -1 == var.fModifiers.fLayout.fBuiltin) {
this->write(" ");
- this->writeType(first.type());
+ this->writeType(var.type());
this->write(" ");
- for (const auto& stmt : decls.fVars) {
- const VarDeclaration& var = stmt->as<VarDeclaration>();
- this->writeName(var.fVar->name());
- if (fProgram.fKind == Program::kVertex_Kind) {
- this->write(" [[user(locn" +
- to_string(var.fVar->fModifiers.fLayout.fLocation) + ")]]");
- } else if (fProgram.fKind == Program::kFragment_Kind) {
- this->write(" [[color(" +
- to_string(var.fVar->fModifiers.fLayout.fLocation) +")");
- int colorIndex = var.fVar->fModifiers.fLayout.fIndex;
- if (colorIndex) {
- this->write(", index(" + to_string(colorIndex) + ")");
- }
- this->write("]]");
+ this->writeName(var.name());
+ if (fProgram.fKind == Program::kVertex_Kind) {
+ this->write(" [[user(locn" +
+ to_string(var.fModifiers.fLayout.fLocation) + ")]]");
+ } else if (fProgram.fKind == Program::kFragment_Kind) {
+ this->write(" [[color(" +
+ to_string(var.fModifiers.fLayout.fLocation) +")");
+ int colorIndex = var.fModifiers.fLayout.fIndex;
+ if (colorIndex) {
+ this->write(", index(" + to_string(colorIndex) + ")");
}
+ this->write("]]");
}
this->write(";\n");
}
@@ -1543,27 +1508,21 @@
visitor->VisitInterfaceBlock(*interfaceType, interfaceName);
}
for (const ProgramElement& element : fProgram) {
- if (element.kind() != ProgramElement::Kind::kVar) {
+ if (!element.is<GlobalVarDeclaration>()) {
continue;
}
- const VarDeclarations& decls = static_cast<const VarDeclarations&>(element);
- if (decls.fVars.empty()) {
- continue;
- }
- const Variable& first = *((VarDeclaration&) *decls.fVars[0]).fVar;
- if ((!first.fModifiers.fFlags && -1 == first.fModifiers.fLayout.fBuiltin) ||
- first.type().typeKind() == Type::TypeKind::kSampler) {
- for (const auto& stmt : decls.fVars) {
- VarDeclaration& var = static_cast<VarDeclaration&>(*stmt);
-
- if (var.fVar->type().typeKind() == Type::TypeKind::kSampler) {
- // Samplers are represented as a "texture/sampler" duo in the global struct.
- visitor->VisitTexture(first.type(), var.fVar->name());
- visitor->VisitSampler(first.type(), String(var.fVar->name()) + SAMPLER_SUFFIX);
- } else {
- // Visit a regular variable.
- visitor->VisitVariable(*var.fVar, var.fValue.get());
- }
+ const GlobalVarDeclaration& decls = element.as<GlobalVarDeclaration>();
+ const VarDeclaration& decl = *decls.fDecl;
+ const Variable& var = *decl.fVar;
+ if ((!var.fModifiers.fFlags && -1 == var.fModifiers.fLayout.fBuiltin) ||
+ var.type().typeKind() == Type::TypeKind::kSampler) {
+ if (var.type().typeKind() == Type::TypeKind::kSampler) {
+ // Samplers are represented as a "texture/sampler" duo in the global struct.
+ visitor->VisitTexture(var.type(), var.name());
+ visitor->VisitSampler(var.type(), String(var.name()) + SAMPLER_SUFFIX);
+ } else {
+ // Visit a regular variable.
+ visitor->VisitVariable(var, decl.fValue.get());
}
}
}
@@ -1677,17 +1636,15 @@
switch (e.kind()) {
case ProgramElement::Kind::kExtension:
break;
- case ProgramElement::Kind::kVar: {
- const VarDeclarations& decl = e.as<VarDeclarations>();
- if (decl.fVars.size() > 0) {
- int builtin = decl.fVars[0]->as<VarDeclaration>().fVar->fModifiers.fLayout.fBuiltin;
- if (-1 == builtin) {
- // normal var
- this->writeVarDeclarations(decl, true);
- this->writeLine();
- } else if (SK_FRAGCOLOR_BUILTIN == builtin) {
- // ignore
- }
+ case ProgramElement::Kind::kGlobalVar: {
+ const VarDeclaration& decl = *e.as<GlobalVarDeclaration>().fDecl;
+ int builtin = decl.fVar->fModifiers.fLayout.fBuiltin;
+ if (-1 == builtin) {
+ // normal var
+ this->writeVarDeclaration(decl, true);
+ this->writeLine();
+ } else if (SK_FRAGCOLOR_BUILTIN == builtin) {
+ // ignore
}
break;
}
@@ -1797,14 +1754,6 @@
const VarDeclaration& var = s->as<VarDeclaration>();
return this->requirements(var.fValue.get());
}
- case Statement::Kind::kVarDeclarations: {
- Requirements result = kNo_Requirements;
- const VarDeclarations& decls = *s->as<VarDeclarationsStatement>().fDeclaration;
- for (const auto& stmt : decls.fVars) {
- result |= this->requirements(stmt.get());
- }
- return result;
- }
case Statement::Kind::kExpression:
return this->requirements(s->as<ExpressionStatement>().expression().get());
case Statement::Kind::kReturn: {
diff --git a/src/sksl/SkSLMetalCodeGenerator.h b/src/sksl/SkSLMetalCodeGenerator.h
index 3276f0d..82a489e 100644
--- a/src/sksl/SkSLMetalCodeGenerator.h
+++ b/src/sksl/SkSLMetalCodeGenerator.h
@@ -42,7 +42,6 @@
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariableReference.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
@@ -177,7 +176,7 @@
void writeName(const String& name);
- void writeVarDeclarations(const VarDeclarations& decl, bool global);
+ void writeVarDeclaration(const VarDeclaration& decl, bool global);
void writeFragCoord();
diff --git a/src/sksl/SkSLPipelineStageCodeGenerator.cpp b/src/sksl/SkSLPipelineStageCodeGenerator.cpp
index 55876a4..35e2aae 100644
--- a/src/sksl/SkSLPipelineStageCodeGenerator.cpp
+++ b/src/sksl/SkSLPipelineStageCodeGenerator.cpp
@@ -45,15 +45,12 @@
int index = 0;
bool found = false;
for (const auto& p : fProgram) {
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- for (const std::unique_ptr<Statement>& raw : decls.fVars) {
- VarDeclaration& decl = raw->as<VarDeclaration>();
- if (decl.fVar == arguments[0]->as<VariableReference>().fVariable) {
- found = true;
- } else if (decl.fVar->type() == *fContext.fFragmentProcessor_Type) {
- ++index;
- }
+ if (p.is<GlobalVarDeclaration>()) {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ if (decl.fVar == arguments[0]->as<VariableReference>().fVariable) {
+ found = true;
+ } else if (decl.fVar->type() == *fContext.fFragmentProcessor_Type) {
+ ++index;
}
}
if (found) {
@@ -127,17 +124,14 @@
if (found) {
break;
}
- if (e.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = e.as<VarDeclarations>();
- for (const auto& decl : decls.fVars) {
- const Variable& var = *decl->as<VarDeclaration>().fVar;
- if (&var == ref.fVariable) {
- found = true;
- break;
- }
- if (var.fModifiers.fFlags & flag) {
- ++index;
- }
+ if (e.is<GlobalVarDeclaration>()) {
+ const Variable& var = *e.as<GlobalVarDeclaration>().fDecl->fVar;
+ if (&var == ref.fVariable) {
+ found = true;
+ break;
+ }
+ if (var.fModifiers.fFlags & flag) {
+ ++index;
}
}
}
@@ -215,15 +209,11 @@
}
void PipelineStageCodeGenerator::writeProgramElement(const ProgramElement& p) {
- if (p.kind() == ProgramElement::Kind::kSection) {
+ if (p.is<Section>()) {
return;
}
- if (p.kind() == ProgramElement::Kind::kVar) {
- const VarDeclarations& decls = p.as<VarDeclarations>();
- if (!decls.fVars.size()) {
- return;
- }
- const Variable& var = *decls.fVars[0]->as<VarDeclaration>().fVar;
+ if (p.is<GlobalVarDeclaration>()) {
+ const Variable& var = *p.as<GlobalVarDeclaration>().fDecl->fVar;
if (var.fModifiers.fFlags &
(Modifiers::kIn_Flag | Modifiers::kUniform_Flag | Modifiers::kVarying_Flag) ||
-1 != var.fModifiers.fLayout.fBuiltin) {
diff --git a/src/sksl/SkSLRehydrator.cpp b/src/sksl/SkSLRehydrator.cpp
index 05d69dc..c778bf4 100644
--- a/src/sksl/SkSLRehydrator.cpp
+++ b/src/sksl/SkSLRehydrator.cpp
@@ -47,7 +47,6 @@
#include "src/sksl/ir/SkSLType.h"
#include "src/sksl/ir/SkSLUnresolvedFunction.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
@@ -323,15 +322,9 @@
std::move(sizes), nullptr));
}
case Rehydrator::kVarDeclarations_Command: {
- const Type* baseType = this->type();
- int count = this->readU8();
- std::vector<std::unique_ptr<Statement>> vars;
- vars.reserve(count);
- for (int i = 0 ; i < count; ++i) {
- vars.push_back(this->statement());
- }
- return std::unique_ptr<ProgramElement>(new VarDeclarations(-1, baseType,
- std::move(vars)));
+ std::unique_ptr<Statement> decl = this->statement();
+ return std::unique_ptr<ProgramElement>(
+ new GlobalVarDeclaration(/*offset=*/-1, std::move(decl)));
}
default:
printf("unsupported element %d\n", kind);
@@ -427,6 +420,7 @@
}
case Rehydrator::kVarDeclaration_Command: {
Variable* var = this->symbolRef<Variable>(Symbol::Kind::kVariable);
+ const Type* baseType = this->type();
uint8_t sizeCount = this->readU8();
std::vector<std::unique_ptr<Expression>> sizes;
sizes.reserve(sizeCount);
@@ -439,20 +433,8 @@
SkASSERT(var->fWriteCount == 0);
++var->fWriteCount;
}
- return std::unique_ptr<Statement>(new VarDeclaration(var,
- std::move(sizes),
- std::move(value)));
- }
- case Rehydrator::kVarDeclarations_Command: {
- const Type* baseType = this->type();
- int count = this->readU8();
- std::vector<std::unique_ptr<Statement>> vars;
- vars.reserve(count);
- for (int i = 0 ; i < count; ++i) {
- vars.push_back(this->statement());
- }
- return std::make_unique<VarDeclarationsStatement>(
- std::make_unique<VarDeclarations>(-1, baseType, std::move(vars)));
+ return std::unique_ptr<Statement>(
+ new VarDeclaration(var, baseType, std::move(sizes), std::move(value)));
}
case Rehydrator::kVoid_Command:
return nullptr;
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
index b3c1bf5..05cbea6 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
@@ -2772,101 +2772,91 @@
}
#define BUILTIN_IGNORE 9999
-void SPIRVCodeGenerator::writeGlobalVars(Program::Kind kind, const VarDeclarations& decl,
- OutputStream& out) {
- for (size_t i = 0; i < decl.fVars.size(); i++) {
- if (decl.fVars[i]->kind() == Statement::Kind::kNop) {
- continue;
- }
- const VarDeclaration& varDecl = (VarDeclaration&) *decl.fVars[i];
- const Variable* var = varDecl.fVar;
- // These haven't been implemented in our SPIR-V generator yet and we only currently use them
- // in the OpenGL backend.
- SkASSERT(!(var->fModifiers.fFlags & (Modifiers::kReadOnly_Flag |
- Modifiers::kWriteOnly_Flag |
- Modifiers::kCoherent_Flag |
- Modifiers::kVolatile_Flag |
- Modifiers::kRestrict_Flag)));
- if (var->fModifiers.fLayout.fBuiltin == BUILTIN_IGNORE) {
- continue;
- }
- if (var->fModifiers.fLayout.fBuiltin == SK_FRAGCOLOR_BUILTIN &&
- kind != Program::kFragment_Kind) {
- SkASSERT(!fProgram.fSettings.fFragColorIsInOut);
- continue;
- }
- if (is_dead(*var)) {
- continue;
- }
- const Type& type = var->type();
- SpvStorageClass_ storageClass;
- if (var->fModifiers.fFlags & Modifiers::kIn_Flag) {
- storageClass = SpvStorageClassInput;
- } else if (var->fModifiers.fFlags & Modifiers::kOut_Flag) {
- storageClass = SpvStorageClassOutput;
- } else if (var->fModifiers.fFlags & Modifiers::kUniform_Flag) {
- if (type.typeKind() == Type::TypeKind::kSampler ||
- type.typeKind() == Type::TypeKind::kSeparateSampler ||
- type.typeKind() == Type::TypeKind::kTexture) {
- storageClass = SpvStorageClassUniformConstant;
- } else {
- storageClass = SpvStorageClassUniform;
- }
+void SPIRVCodeGenerator::writeGlobalVar(Program::Kind kind, const VarDeclaration& varDecl,
+ OutputStream& out) {
+ const Variable* var = varDecl.fVar;
+ // These haven't been implemented in our SPIR-V generator yet and we only currently use them
+ // in the OpenGL backend.
+ SkASSERT(!(var->fModifiers.fFlags & (Modifiers::kReadOnly_Flag |
+ Modifiers::kWriteOnly_Flag |
+ Modifiers::kCoherent_Flag |
+ Modifiers::kVolatile_Flag |
+ Modifiers::kRestrict_Flag)));
+ if (var->fModifiers.fLayout.fBuiltin == BUILTIN_IGNORE) {
+ return;
+ }
+ if (var->fModifiers.fLayout.fBuiltin == SK_FRAGCOLOR_BUILTIN &&
+ kind != Program::kFragment_Kind) {
+ SkASSERT(!fProgram.fSettings.fFragColorIsInOut);
+ return;
+ }
+ if (is_dead(*var)) {
+ return;
+ }
+ const Type& type = var->type();
+ SpvStorageClass_ storageClass;
+ if (var->fModifiers.fFlags & Modifiers::kIn_Flag) {
+ storageClass = SpvStorageClassInput;
+ } else if (var->fModifiers.fFlags & Modifiers::kOut_Flag) {
+ storageClass = SpvStorageClassOutput;
+ } else if (var->fModifiers.fFlags & Modifiers::kUniform_Flag) {
+ if (type.typeKind() == Type::TypeKind::kSampler ||
+ type.typeKind() == Type::TypeKind::kSeparateSampler ||
+ type.typeKind() == Type::TypeKind::kTexture) {
+ storageClass = SpvStorageClassUniformConstant;
} else {
- storageClass = SpvStorageClassPrivate;
+ storageClass = SpvStorageClassUniform;
}
- SpvId id = this->nextId();
- fVariableMap[var] = id;
- SpvId typeId;
- if (var->fModifiers.fLayout.fBuiltin == SK_IN_BUILTIN) {
- typeId = this->getPointerType(Type("sk_in", Type::TypeKind::kArray,
- type.componentType(), fSkInCount),
- storageClass);
- } else {
- typeId = this->getPointerType(type, storageClass);
- }
- this->writeInstruction(SpvOpVariable, typeId, id, storageClass, fConstantBuffer);
- this->writeInstruction(SpvOpName, id, var->name(), fNameBuffer);
- this->writePrecisionModifier(type, id);
- if (varDecl.fValue) {
- SkASSERT(!fCurrentBlock);
- fCurrentBlock = -1;
- SpvId value = this->writeExpression(*varDecl.fValue, fGlobalInitializersBuffer);
- this->writeInstruction(SpvOpStore, id, value, fGlobalInitializersBuffer);
- fCurrentBlock = 0;
- }
- this->writeLayout(var->fModifiers.fLayout, id);
- if (var->fModifiers.fFlags & Modifiers::kFlat_Flag) {
- this->writeInstruction(SpvOpDecorate, id, SpvDecorationFlat, fDecorationBuffer);
- }
- if (var->fModifiers.fFlags & Modifiers::kNoPerspective_Flag) {
- this->writeInstruction(SpvOpDecorate, id, SpvDecorationNoPerspective,
- fDecorationBuffer);
- }
+ } else {
+ storageClass = SpvStorageClassPrivate;
+ }
+ SpvId id = this->nextId();
+ fVariableMap[var] = id;
+ SpvId typeId;
+ if (var->fModifiers.fLayout.fBuiltin == SK_IN_BUILTIN) {
+ typeId = this->getPointerType(
+ Type("sk_in", Type::TypeKind::kArray, type.componentType(), fSkInCount),
+ storageClass);
+ } else {
+ typeId = this->getPointerType(type, storageClass);
+ }
+ this->writeInstruction(SpvOpVariable, typeId, id, storageClass, fConstantBuffer);
+ this->writeInstruction(SpvOpName, id, var->name(), fNameBuffer);
+ this->writePrecisionModifier(type, id);
+ if (varDecl.fValue) {
+ SkASSERT(!fCurrentBlock);
+ fCurrentBlock = -1;
+ SpvId value = this->writeExpression(*varDecl.fValue, fGlobalInitializersBuffer);
+ this->writeInstruction(SpvOpStore, id, value, fGlobalInitializersBuffer);
+ fCurrentBlock = 0;
+ }
+ this->writeLayout(var->fModifiers.fLayout, id);
+ if (var->fModifiers.fFlags & Modifiers::kFlat_Flag) {
+ this->writeInstruction(SpvOpDecorate, id, SpvDecorationFlat, fDecorationBuffer);
+ }
+ if (var->fModifiers.fFlags & Modifiers::kNoPerspective_Flag) {
+ this->writeInstruction(SpvOpDecorate, id, SpvDecorationNoPerspective,
+ fDecorationBuffer);
}
}
-void SPIRVCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, OutputStream& out) {
- for (const auto& stmt : decl.fVars) {
- SkASSERT(stmt->kind() == Statement::Kind::kVarDeclaration);
- VarDeclaration& varDecl = (VarDeclaration&) *stmt;
- const Variable* var = varDecl.fVar;
- // These haven't been implemented in our SPIR-V generator yet and we only currently use them
- // in the OpenGL backend.
- SkASSERT(!(var->fModifiers.fFlags & (Modifiers::kReadOnly_Flag |
- Modifiers::kWriteOnly_Flag |
- Modifiers::kCoherent_Flag |
- Modifiers::kVolatile_Flag |
- Modifiers::kRestrict_Flag)));
- SpvId id = this->nextId();
- fVariableMap[var] = id;
- SpvId type = this->getPointerType(var->type(), SpvStorageClassFunction);
- this->writeInstruction(SpvOpVariable, type, id, SpvStorageClassFunction, fVariableBuffer);
- this->writeInstruction(SpvOpName, id, var->name(), fNameBuffer);
- if (varDecl.fValue) {
- SpvId value = this->writeExpression(*varDecl.fValue, out);
- this->writeInstruction(SpvOpStore, id, value, out);
- }
+void SPIRVCodeGenerator::writeVarDeclaration(const VarDeclaration& varDecl, OutputStream& out) {
+ const Variable* var = varDecl.fVar;
+ // These haven't been implemented in our SPIR-V generator yet and we only currently use them
+ // in the OpenGL backend.
+ SkASSERT(!(var->fModifiers.fFlags & (Modifiers::kReadOnly_Flag |
+ Modifiers::kWriteOnly_Flag |
+ Modifiers::kCoherent_Flag |
+ Modifiers::kVolatile_Flag |
+ Modifiers::kRestrict_Flag)));
+ SpvId id = this->nextId();
+ fVariableMap[var] = id;
+ SpvId type = this->getPointerType(var->type(), SpvStorageClassFunction);
+ this->writeInstruction(SpvOpVariable, type, id, SpvStorageClassFunction, fVariableBuffer);
+ this->writeInstruction(SpvOpName, id, var->name(), fNameBuffer);
+ if (varDecl.fValue) {
+ SpvId value = this->writeExpression(*varDecl.fValue, out);
+ this->writeInstruction(SpvOpStore, id, value, out);
}
}
@@ -2884,8 +2874,8 @@
case Statement::Kind::kReturn:
this->writeReturnStatement(s.as<ReturnStatement>(), out);
break;
- case Statement::Kind::kVarDeclarations:
- this->writeVarDeclarations(*s.as<VarDeclarationsStatement>().fDeclaration, out);
+ case Statement::Kind::kVarDeclaration:
+ this->writeVarDeclaration(s.as<VarDeclaration>(), out);
break;
case Statement::Kind::kIf:
this->writeIfStatement(s.as<IfStatement>(), out);
@@ -3216,8 +3206,8 @@
}
}
for (const auto& e : program) {
- if (e.kind() == ProgramElement::Kind::kVar) {
- this->writeGlobalVars(program.fKind, ((VarDeclarations&) e), body);
+ if (e.is<GlobalVarDeclaration>()) {
+ this->writeGlobalVar(program.fKind, *e.as<GlobalVarDeclaration>().fDecl, body);
}
}
for (const auto& e : program) {
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.h b/src/sksl/SkSLSPIRVCodeGenerator.h
index 580a74f..2bc8b32 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.h
+++ b/src/sksl/SkSLSPIRVCodeGenerator.h
@@ -38,7 +38,6 @@
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariableReference.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
#include "src/sksl/spirv.h"
@@ -189,9 +188,9 @@
SpvId writeFunction(const FunctionDefinition& f, OutputStream& out);
- void writeGlobalVars(Program::Kind kind, const VarDeclarations& v, OutputStream& out);
+ void writeGlobalVar(Program::Kind kind, const VarDeclaration& v, OutputStream& out);
- void writeVarDeclarations(const VarDeclarations& decl, OutputStream& out);
+ void writeVarDeclaration(const VarDeclaration& var, OutputStream& out);
SpvId writeVariableReference(const VariableReference& ref, OutputStream& out);
diff --git a/src/sksl/SkSLSampleUsage.cpp b/src/sksl/SkSLSampleUsage.cpp
index c545ce3..87d5790 100644
--- a/src/sksl/SkSLSampleUsage.cpp
+++ b/src/sksl/SkSLSampleUsage.cpp
@@ -24,7 +24,6 @@
#include "src/sksl/ir/SkSLSwitchStatement.h"
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
diff --git a/src/sksl/SkSLSectionAndParameterHelper.cpp b/src/sksl/SkSLSectionAndParameterHelper.cpp
index ee13e63..0116c9c 100644
--- a/src/sksl/SkSLSectionAndParameterHelper.cpp
+++ b/src/sksl/SkSLSectionAndParameterHelper.cpp
@@ -21,7 +21,6 @@
#include "src/sksl/ir/SkSLSwitchStatement.h"
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
-#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLWhileStatement.h"
namespace SkSL {
@@ -30,13 +29,10 @@
: fProgram(*program) {
for (const auto& p : fProgram) {
switch (p.kind()) {
- case ProgramElement::Kind::kVar: {
- const VarDeclarations& decls = (const VarDeclarations&) p;
- for (const auto& raw : decls.fVars) {
- const VarDeclaration& decl = (VarDeclaration&) *raw;
- if (IsParameter(*decl.fVar)) {
- fParameters.push_back(decl.fVar);
- }
+ case ProgramElement::Kind::kGlobalVar: {
+ const VarDeclaration& decl = *p.as<GlobalVarDeclaration>().fDecl;
+ if (IsParameter(*decl.fVar)) {
+ fParameters.push_back(decl.fVar);
}
break;
}
diff --git a/src/sksl/generated/sksl_fp.dehydrated.sksl b/src/sksl/generated/sksl_fp.dehydrated.sksl
index 5e08e78..676fea1 100644
--- a/src/sksl/generated/sksl_fp.dehydrated.sksl
+++ b/src/sksl/generated/sksl_fp.dehydrated.sksl
@@ -1,2 +1,2 @@
-static constexpr size_t SKSL_INCLUDE_sksl_fp_LENGTH = 1594;
-static uint8_t SKSL_INCLUDE_sksl_fp[1594] = {98,1,14,71,114,67,108,105,112,69,100,103,101,84,121,112,101,12,80,77,67,111,110,118,101,114,115,105,111,110,12,115,107,95,70,114,97,103,67,111,111,114,100,6,102,108,111,97,116,52,3,105,110,116,13,115,107,95,83,97,109,112,108,101,77,97,115,107,15,103,108,95,76,97,115,116,70,114,97,103,68,97,116,97,16,103,108,95,76,97,115,116,70,114,97,103,67,111,108,111,114,5,104,97,108,102,52,19,103,108,95,76,97,115,116,70,114,97,103,67,111,108,111,114,65,82,77,24,103,108,95,83,101,99,111,110,100,97,114,121,70,114,97,103,67,111,108,111,114,69,88,84,11,115,107,95,79,117,116,67,111,108,111,114,8,115,107,95,87,105,100,116,104,4,104,97,108,102,9,115,107,95,72,101,105,103,104,116,2,102,112,17,102,114,97,103,109,101,110,116,80,114,111,99,101,115,115,111,114,6,115,97,109,112,108,101,9,116,114,97,110,115,102,111,114,109,8,102,108,111,97,116,51,120,51,6,99,111,111,114,100,115,6,102,108,111,97,116,50,5,105,110,112,117,116,9,116,114,97,110,115,102,114,111,109,7,107,70,105,108,108,66,87,7,107,70,105,108,108,65,65,14,107,73,110,118,101,114,115,101,70,105,108,108,66,87,14,107,73,110,118,101,114,115,101,70,105,108,108,65,65,5,107,76,97,115,116,9,107,84,111,80,114,101,109,117,108,11,107,84,111,85,110,112,114,101,109,117,108,16,107,80,77,67,111,110,118,101,114,115,105,111,110,67,110,116,42,68,0,14,1,0,2,0,14,2,0,17,0,46,3,0,29,5,15,0,2,30,0,43,4,0,43,0,0,0,5,0,43,6,0,50,0,1,46,7,0,29,5,20,0,4,54,0,40,5,0,0,0,8,0,40,4,0,1,46,9,0,29,5,15,39,0,68,0,40,8,0,0,46,10,0,29,5,15,39,0,84,0,43,11,0,101,0,0,46,12,0,29,5,15,39,0,107,0,40,11,0,0,46,13,0,29,5,15,39,0,127,0,40,11,0,0,46,14,0,29,5,20,39,4,152,0,40,11,0,0,46,15,0,29,5,27,39,0,164,0,43,16,0,173,0,0,46,17,0,29,5,28,39,0,178,0,40,16,0,0,46,18,0,9,188,0,43,19,0,191,0,3,22,20,0,9,209,0,1,18,0,40,11,0,46,21,0,9,188,0,40,19,0,3,46,22,0,9,216,0,43,23,0,226,0,3,45,24,0,2,40,20,0,22,25,0,9,209,0,2,21,0,22,0,40,11,0,40,25,0,46,26,0,9,188,0,40,19,0,3,46,27,0,9,235,0,43,28,0,242,0,3,45,29,0,3,40,20,0,40,25,0,22,30,0,9,209,0,2,26,0,27,0,40,11,0,40,30,0,46,31,0,9,188,0,40,19,0,3,46,32,0,9,249,0,40,11,0,3,45,33,0,4,40,20,0,40,25,0,40,30,0,22,34,0,9,209,0,2,31,0,32,0,40,11,0,40,34,0,46,35,0,9,188,0,40,19,0,3,46,36,0,9,249,0,40,11,0,3,46,37,0,9,216,0,40,23,0,3,45,38,0,5,40,20,0,40,25,0,40,30,0,40,34,0,22,39,0,9,209,0,3,35,0,36,0,37,0,40,11,0,40,39,0,46,40,0,9,188,0,40,19,0,3,46,41,0,9,249,0,40,11,0,3,46,42,0,9,235,0,40,28,0,3,45,43,0,6,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,22,44,0,9,209,0,3,40,0,41,0,42,0,40,11,0,40,44,0,31,45,0,40,19,0,46,46,0,9,188,0,40,45,0,3,45,47,0,7,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,22,48,0,9,209,0,1,46,0,40,11,0,40,48,0,31,49,0,40,19,0,46,50,0,9,188,0,40,49,0,3,46,51,0,9,216,0,40,23,0,3,45,52,0,8,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,22,53,0,9,209,0,2,50,0,51,0,40,11,0,40,53,0,31,54,0,40,19,0,46,55,0,9,188,0,40,54,0,3,46,56,0,9,235,0,40,28,0,3,45,57,0,9,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,22,58,0,9,209,0,2,55,0,56,0,40,11,0,40,58,0,31,59,0,40,19,0,46,60,0,9,188,0,40,59,0,3,46,61,0,9,249,0,40,11,0,3,45,62,0,10,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,40,58,0,22,63,0,9,209,0,2,60,0,61,0,40,11,0,40,63,0,31,64,0,40,19,0,46,65,0,9,188,0,40,64,0,3,46,66,0,9,249,0,40,11,0,3,46,67,0,9,255,0,40,23,0,3,45,68,0,11,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,40,58,0,40,63,0,22,69,0,9,209,0,3,65,0,66,0,67,0,40,11,0,40,69,0,31,70,0,40,19,0,46,71,0,9,188,0,40,70,0,3,46,72,0,9,249,0,40,11,0,3,46,73,0,9,235,0,40,28,0,3,45,74,0,12,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,40,58,0,40,63,0,40,69,0,22,75,0,9,209,0,3,71,0,72,0,73,0,40,11,0,40,75,0,12,0,2,0,0,0,17,0,1,0,84,0,7,0,107,0,8,0,68,0,6,0,127,0,9,0,209,0,66,0,30,0,2,0,178,0,12,0,152,0,10,0,54,0,4,0,164,0,11,0,12,11,13,2,0,42,5,0,46,76,0,29,8,1,9,1,40,1,0,0,46,77,0,29,8,1,17,1,40,1,0,0,46,78,0,29,8,1,25,1,40,1,0,0,46,79,0,29,8,1,40,1,40,1,0,0,46,80,0,29,8,1,55,1,40,1,0,0,5,0,17,1,1,0,9,1,0,0,40,1,3,0,25,1,2,0,55,1,4,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,13,17,0,42,3,0,46,81,0,29,8,1,61,1,40,2,0,0,46,82,0,29,8,1,71,1,40,2,0,0,46,83,0,29,8,1,83,1,40,2,0,0,3,0,83,1,2,0,61,1,0,0,71,1,1,0,0,0,0,0,1,0,0,0,2,0,0,0,48,40,4,0,1,47,3,0,0,50,48,40,6,0,1,47,7,0,1,27,1,0,0,0,50,48,40,4,0,1,47,9,0,1,27,1,0,0,0,50,48,40,11,0,1,47,10,0,0,50,48,40,11,0,1,47,12,0,0,50,48,40,11,0,1,47,13,0,0,50,48,40,11,0,1,47,14,0,0,50,48,40,16,0,1,47,15,0,0,50,48,40,16,0,1,47,17,0,0,50,};
+static constexpr size_t SKSL_INCLUDE_sksl_fp_LENGTH = 1585;
+static uint8_t SKSL_INCLUDE_sksl_fp[1585] = {98,1,14,71,114,67,108,105,112,69,100,103,101,84,121,112,101,12,80,77,67,111,110,118,101,114,115,105,111,110,12,115,107,95,70,114,97,103,67,111,111,114,100,6,102,108,111,97,116,52,3,105,110,116,13,115,107,95,83,97,109,112,108,101,77,97,115,107,15,103,108,95,76,97,115,116,70,114,97,103,68,97,116,97,16,103,108,95,76,97,115,116,70,114,97,103,67,111,108,111,114,5,104,97,108,102,52,19,103,108,95,76,97,115,116,70,114,97,103,67,111,108,111,114,65,82,77,24,103,108,95,83,101,99,111,110,100,97,114,121,70,114,97,103,67,111,108,111,114,69,88,84,11,115,107,95,79,117,116,67,111,108,111,114,8,115,107,95,87,105,100,116,104,4,104,97,108,102,9,115,107,95,72,101,105,103,104,116,2,102,112,17,102,114,97,103,109,101,110,116,80,114,111,99,101,115,115,111,114,6,115,97,109,112,108,101,9,116,114,97,110,115,102,111,114,109,8,102,108,111,97,116,51,120,51,6,99,111,111,114,100,115,6,102,108,111,97,116,50,5,105,110,112,117,116,9,116,114,97,110,115,102,114,111,109,7,107,70,105,108,108,66,87,7,107,70,105,108,108,65,65,14,107,73,110,118,101,114,115,101,70,105,108,108,66,87,14,107,73,110,118,101,114,115,101,70,105,108,108,65,65,5,107,76,97,115,116,9,107,84,111,80,114,101,109,117,108,11,107,84,111,85,110,112,114,101,109,117,108,16,107,80,77,67,111,110,118,101,114,115,105,111,110,67,110,116,42,68,0,14,1,0,2,0,14,2,0,17,0,46,3,0,29,5,15,0,2,30,0,43,4,0,43,0,0,0,5,0,43,6,0,50,0,1,46,7,0,29,5,20,0,4,54,0,40,5,0,0,0,8,0,40,4,0,1,46,9,0,29,5,15,39,0,68,0,40,8,0,0,46,10,0,29,5,15,39,0,84,0,43,11,0,101,0,0,46,12,0,29,5,15,39,0,107,0,40,11,0,0,46,13,0,29,5,15,39,0,127,0,40,11,0,0,46,14,0,29,5,20,39,4,152,0,40,11,0,0,46,15,0,29,5,27,39,0,164,0,43,16,0,173,0,0,46,17,0,29,5,28,39,0,178,0,40,16,0,0,46,18,0,9,188,0,43,19,0,191,0,3,22,20,0,9,209,0,1,18,0,40,11,0,46,21,0,9,188,0,40,19,0,3,46,22,0,9,216,0,43,23,0,226,0,3,45,24,0,2,40,20,0,22,25,0,9,209,0,2,21,0,22,0,40,11,0,40,25,0,46,26,0,9,188,0,40,19,0,3,46,27,0,9,235,0,43,28,0,242,0,3,45,29,0,3,40,20,0,40,25,0,22,30,0,9,209,0,2,26,0,27,0,40,11,0,40,30,0,46,31,0,9,188,0,40,19,0,3,46,32,0,9,249,0,40,11,0,3,45,33,0,4,40,20,0,40,25,0,40,30,0,22,34,0,9,209,0,2,31,0,32,0,40,11,0,40,34,0,46,35,0,9,188,0,40,19,0,3,46,36,0,9,249,0,40,11,0,3,46,37,0,9,216,0,40,23,0,3,45,38,0,5,40,20,0,40,25,0,40,30,0,40,34,0,22,39,0,9,209,0,3,35,0,36,0,37,0,40,11,0,40,39,0,46,40,0,9,188,0,40,19,0,3,46,41,0,9,249,0,40,11,0,3,46,42,0,9,235,0,40,28,0,3,45,43,0,6,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,22,44,0,9,209,0,3,40,0,41,0,42,0,40,11,0,40,44,0,31,45,0,40,19,0,46,46,0,9,188,0,40,45,0,3,45,47,0,7,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,22,48,0,9,209,0,1,46,0,40,11,0,40,48,0,31,49,0,40,19,0,46,50,0,9,188,0,40,49,0,3,46,51,0,9,216,0,40,23,0,3,45,52,0,8,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,22,53,0,9,209,0,2,50,0,51,0,40,11,0,40,53,0,31,54,0,40,19,0,46,55,0,9,188,0,40,54,0,3,46,56,0,9,235,0,40,28,0,3,45,57,0,9,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,22,58,0,9,209,0,2,55,0,56,0,40,11,0,40,58,0,31,59,0,40,19,0,46,60,0,9,188,0,40,59,0,3,46,61,0,9,249,0,40,11,0,3,45,62,0,10,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,40,58,0,22,63,0,9,209,0,2,60,0,61,0,40,11,0,40,63,0,31,64,0,40,19,0,46,65,0,9,188,0,40,64,0,3,46,66,0,9,249,0,40,11,0,3,46,67,0,9,255,0,40,23,0,3,45,68,0,11,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,40,58,0,40,63,0,22,69,0,9,209,0,3,65,0,66,0,67,0,40,11,0,40,69,0,31,70,0,40,19,0,46,71,0,9,188,0,40,70,0,3,46,72,0,9,249,0,40,11,0,3,46,73,0,9,235,0,40,28,0,3,45,74,0,12,40,20,0,40,25,0,40,30,0,40,34,0,40,39,0,40,44,0,40,48,0,40,53,0,40,58,0,40,63,0,40,69,0,22,75,0,9,209,0,3,71,0,72,0,73,0,40,11,0,40,75,0,12,0,2,0,0,0,17,0,1,0,84,0,7,0,107,0,8,0,68,0,6,0,127,0,9,0,209,0,66,0,30,0,2,0,178,0,12,0,152,0,10,0,54,0,4,0,164,0,11,0,12,11,13,2,0,42,5,0,46,76,0,29,8,1,9,1,40,1,0,0,46,77,0,29,8,1,17,1,40,1,0,0,46,78,0,29,8,1,25,1,40,1,0,0,46,79,0,29,8,1,40,1,40,1,0,0,46,80,0,29,8,1,55,1,40,1,0,0,5,0,17,1,1,0,9,1,0,0,40,1,3,0,25,1,2,0,55,1,4,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,13,17,0,42,3,0,46,81,0,29,8,1,61,1,40,2,0,0,46,82,0,29,8,1,71,1,40,2,0,0,46,83,0,29,8,1,83,1,40,2,0,0,3,0,83,1,2,0,61,1,0,0,71,1,1,0,0,0,0,0,1,0,0,0,2,0,0,0,48,47,3,0,40,4,0,0,50,48,47,7,0,40,6,0,1,27,1,0,0,0,50,48,47,9,0,40,4,0,1,27,1,0,0,0,50,48,47,10,0,40,11,0,0,50,48,47,12,0,40,11,0,0,50,48,47,13,0,40,11,0,0,50,48,47,14,0,40,11,0,0,50,48,47,15,0,40,16,0,0,50,48,47,17,0,40,16,0,0,50,};
diff --git a/src/sksl/generated/sksl_frag.dehydrated.sksl b/src/sksl/generated/sksl_frag.dehydrated.sksl
index 5c78a50..c351969 100644
--- a/src/sksl/generated/sksl_frag.dehydrated.sksl
+++ b/src/sksl/generated/sksl_frag.dehydrated.sksl
@@ -1,2 +1,2 @@
-static constexpr size_t SKSL_INCLUDE_sksl_frag_LENGTH = 417;
-static uint8_t SKSL_INCLUDE_sksl_frag[417] = {142,0,12,115,107,95,70,114,97,103,67,111,111,114,100,6,102,108,111,97,116,52,12,115,107,95,67,108,111,99,107,119,105,115,101,4,98,111,111,108,3,105,110,116,13,115,107,95,83,97,109,112,108,101,77,97,115,107,24,103,108,95,83,101,99,111,110,100,97,114,121,70,114,97,103,67,111,108,111,114,69,88,84,5,104,97,108,102,52,0,12,115,107,95,70,114,97,103,67,111,108,111,114,16,115,107,95,76,97,115,116,70,114,97,103,67,111,108,111,114,8,115,107,95,87,105,100,116,104,4,104,97,108,102,9,115,107,95,72,101,105,103,104,116,42,9,0,46,1,0,29,5,15,0,2,2,0,43,2,0,15,0,0,46,3,0,29,5,17,0,2,22,0,43,4,0,35,0,0,0,5,0,43,6,0,40,0,1,46,7,0,29,5,20,0,4,44,0,40,5,0,0,46,8,0,29,5,15,39,4,58,0,43,9,0,83,0,0,46,10,0,29,28,0,0,0,0,0,255,255,0,255,17,39,255,255,255,255,255,89,0,89,0,0,0,4,90,0,40,9,0,0,46,11,0,29,5,24,39,0,103,0,40,9,0,0,46,12,0,29,5,27,39,0,120,0,43,13,0,129,0,0,46,14,0,29,5,28,39,0,134,0,40,13,0,0,8,0,58,0,4,0,22,0,1,0,90,0,5,0,2,0,0,0,134,0,8,0,103,0,6,0,44,0,3,0,120,0,7,0,12,8,48,40,2,0,1,47,1,0,0,50,48,40,4,0,1,47,3,0,0,50,48,40,6,0,1,47,7,0,1,27,1,0,0,0,50,48,40,9,0,1,47,8,0,0,50,48,40,9,0,1,47,10,0,0,50,48,40,9,0,1,47,11,0,0,50,48,40,13,0,1,47,12,0,0,50,48,40,13,0,1,47,14,0,0,50,};
+static constexpr size_t SKSL_INCLUDE_sksl_frag_LENGTH = 409;
+static uint8_t SKSL_INCLUDE_sksl_frag[409] = {142,0,12,115,107,95,70,114,97,103,67,111,111,114,100,6,102,108,111,97,116,52,12,115,107,95,67,108,111,99,107,119,105,115,101,4,98,111,111,108,3,105,110,116,13,115,107,95,83,97,109,112,108,101,77,97,115,107,24,103,108,95,83,101,99,111,110,100,97,114,121,70,114,97,103,67,111,108,111,114,69,88,84,5,104,97,108,102,52,0,12,115,107,95,70,114,97,103,67,111,108,111,114,16,115,107,95,76,97,115,116,70,114,97,103,67,111,108,111,114,8,115,107,95,87,105,100,116,104,4,104,97,108,102,9,115,107,95,72,101,105,103,104,116,42,9,0,46,1,0,29,5,15,0,2,2,0,43,2,0,15,0,0,46,3,0,29,5,17,0,2,22,0,43,4,0,35,0,0,0,5,0,43,6,0,40,0,1,46,7,0,29,5,20,0,4,44,0,40,5,0,0,46,8,0,29,5,15,39,4,58,0,43,9,0,83,0,0,46,10,0,29,28,0,0,0,0,0,255,255,0,255,17,39,255,255,255,255,255,89,0,89,0,0,0,4,90,0,40,9,0,0,46,11,0,29,5,24,39,0,103,0,40,9,0,0,46,12,0,29,5,27,39,0,120,0,43,13,0,129,0,0,46,14,0,29,5,28,39,0,134,0,40,13,0,0,8,0,58,0,4,0,22,0,1,0,90,0,5,0,2,0,0,0,134,0,8,0,103,0,6,0,44,0,3,0,120,0,7,0,12,8,48,47,1,0,40,2,0,0,50,48,47,3,0,40,4,0,0,50,48,47,7,0,40,6,0,1,27,1,0,0,0,50,48,47,8,0,40,9,0,0,50,48,47,10,0,40,9,0,0,50,48,47,11,0,40,9,0,0,50,48,47,12,0,40,13,0,0,50,48,47,14,0,40,13,0,0,50,};
diff --git a/src/sksl/generated/sksl_geom.dehydrated.sksl b/src/sksl/generated/sksl_geom.dehydrated.sksl
index 9456216..b3c2756 100644
--- a/src/sksl/generated/sksl_geom.dehydrated.sksl
+++ b/src/sksl/generated/sksl_geom.dehydrated.sksl
@@ -1,2 +1,2 @@
-static constexpr size_t SKSL_INCLUDE_sksl_geom_LENGTH = 418;
-static uint8_t SKSL_INCLUDE_sksl_geom[418] = {150,0,12,115,107,95,80,101,114,86,101,114,116,101,120,11,115,107,95,80,111,115,105,116,105,111,110,6,102,108,111,97,116,52,12,115,107,95,80,111,105,110,116,83,105,122,101,5,102,108,111,97,116,5,115,107,95,105,110,15,115,107,95,73,110,118,111,99,97,116,105,111,110,73,68,3,105,110,116,6,115,116,114,101,97,109,16,69,109,105,116,83,116,114,101,97,109,86,101,114,116,101,120,4,118,111,105,100,18,69,110,100,83,116,114,101,97,109,80,114,105,109,105,116,105,118,101,10,69,109,105,116,86,101,114,116,101,120,12,69,110,100,80,114,105,109,105,116,105,118,101,0,42,13,0,37,1,0,2,0,2,29,5,0,0,0,15,0,43,2,0,27,0,29,5,1,0,0,34,0,43,3,0,47,0,46,4,0,29,5,18,39,2,53,0,0,5,0,40,1,0,255,0,37,6,0,2,0,2,29,5,0,0,0,15,0,40,2,0,29,5,1,0,0,34,0,40,3,0,46,7,0,29,5,23,39,4,2,0,40,6,0,0,16,7,0,0,16,7,0,1,46,8,0,29,5,8,0,2,59,0,43,9,0,75,0,0,46,10,0,9,79,0,40,9,0,3,22,11,0,30,8,0,16,0,0,86,0,1,10,0,43,12,0,103,0,46,13,0,9,79,0,40,9,0,3,22,14,0,30,8,0,16,0,0,108,0,1,13,0,40,12,0,22,15,0,30,8,0,16,0,0,127,0,0,40,12,0,22,16,0,30,8,0,16,0,0,138,0,0,40,12,0,8,0,86,0,8,0,127,0,11,0,138,0,12,0,108,0,10,0,59,0,6,0,34,0,5,0,15,0,4,0,53,0,1,0,12,3,26,40,4,0,2,0,53,0,1,50,26,40,7,0,2,0,151,0,0,48,40,9,0,1,47,8,0,0,50,};
+static constexpr size_t SKSL_INCLUDE_sksl_geom_LENGTH = 417;
+static uint8_t SKSL_INCLUDE_sksl_geom[417] = {150,0,12,115,107,95,80,101,114,86,101,114,116,101,120,11,115,107,95,80,111,115,105,116,105,111,110,6,102,108,111,97,116,52,12,115,107,95,80,111,105,110,116,83,105,122,101,5,102,108,111,97,116,5,115,107,95,105,110,15,115,107,95,73,110,118,111,99,97,116,105,111,110,73,68,3,105,110,116,6,115,116,114,101,97,109,16,69,109,105,116,83,116,114,101,97,109,86,101,114,116,101,120,4,118,111,105,100,18,69,110,100,83,116,114,101,97,109,80,114,105,109,105,116,105,118,101,10,69,109,105,116,86,101,114,116,101,120,12,69,110,100,80,114,105,109,105,116,105,118,101,0,42,13,0,37,1,0,2,0,2,29,5,0,0,0,15,0,43,2,0,27,0,29,5,1,0,0,34,0,43,3,0,47,0,46,4,0,29,5,18,39,2,53,0,0,5,0,40,1,0,255,0,37,6,0,2,0,2,29,5,0,0,0,15,0,40,2,0,29,5,1,0,0,34,0,40,3,0,46,7,0,29,5,23,39,4,2,0,40,6,0,0,16,7,0,0,16,7,0,1,46,8,0,29,5,8,0,2,59,0,43,9,0,75,0,0,46,10,0,9,79,0,40,9,0,3,22,11,0,30,8,0,16,0,0,86,0,1,10,0,43,12,0,103,0,46,13,0,9,79,0,40,9,0,3,22,14,0,30,8,0,16,0,0,108,0,1,13,0,40,12,0,22,15,0,30,8,0,16,0,0,127,0,0,40,12,0,22,16,0,30,8,0,16,0,0,138,0,0,40,12,0,8,0,86,0,8,0,127,0,11,0,138,0,12,0,108,0,10,0,59,0,6,0,34,0,5,0,15,0,4,0,53,0,1,0,12,3,26,40,4,0,2,0,53,0,1,50,26,40,7,0,2,0,151,0,0,48,47,8,0,40,9,0,0,50,};
diff --git a/src/sksl/generated/sksl_gpu.dehydrated.sksl b/src/sksl/generated/sksl_gpu.dehydrated.sksl
index 51aaff2..13cb503 100644
--- a/src/sksl/generated/sksl_gpu.dehydrated.sksl
+++ b/src/sksl/generated/sksl_gpu.dehydrated.sksl
@@ -1,2 +1,2 @@
-static constexpr size_t SKSL_INCLUDE_sksl_gpu_LENGTH = 23062;
-static uint8_t SKSL_INCLUDE_sksl_gpu[23062] = {28,10,11,83,107,66,108,101,110,100,77,111,100,101,7,100,101,103,114,101,101,115,8,36,103,101,110,84,121,112,101,7,114,97,100,105,97,110,115,5,97,110,103,108,101,3,115,105,110,3,99,111,115,3,116,97,110,1,120,4,97,115,105,110,4,97,99,111,115,1,121,4,97,116,97,110,8,121,95,111,118,101,114,95,120,4,115,105,110,104,4,99,111,115,104,4,116,97,110,104,5,97,115,105,110,104,5,97,99,111,115,104,5,97,116,97,110,104,3,112,111,119,3,101,120,112,3,108,111,103,4,101,120,112,50,4,108,111,103,50,4,115,113,114,116,9,36,103,101,110,72,84,121,112,101,11,105,110,118,101,114,115,101,115,113,114,116,3,97,98,115,9,36,103,101,110,73,84,121,112,101,4,115,105,103,110,5,102,108,111,111,114,5,116,114,117,110,99,5,114,111,117,110,100,9,114,111,117,110,100,69,118,101,110,4,99,101,105,108,5,102,114,97,99,116,5,102,108,111,97,116,3,109,111,100,4,104,97,108,102,1,105,4,109,111,100,102,3,109,105,110,3,105,110,116,3,109,97,120,6,109,105,110,86,97,108,6,109,97,120,86,97,108,5,99,108,97,109,112,8,115,97,116,117,114,97,116,101,1,97,3,109,105,120,9,36,103,101,110,66,84,121,112,101,4,101,100,103,101,4,115,116,101,112,5,101,100,103,101,48,5,101,100,103,101,49,10,115,109,111,111,116,104,115,116,101,112,5,105,115,110,97,110,5,105,115,105,110,102,5,118,97,108,117,101,14,102,108,111,97,116,66,105,116,115,84,111,73,110,116,14,105,110,116,66,105,116,115,84,111,102,108,111,97,116,9,36,103,101,110,85,84,121,112,101,15,117,105,110,116,66,105,116,115,84,111,102,108,111,97,116,1,98,1,99,3,102,109,97,5,102,114,101,120,112,5,108,100,101,120,112,1,118,6,102,108,111,97,116,50,13,112,97,99,107,85,110,111,114,109,50,120,49,54,4,117,105,110,116,13,112,97,99,107,83,110,111,114,109,50,120,49,54,6,102,108,111,97,116,52,12,112,97,99,107,85,110,111,114,109,52,120,56,12,112,97,99,107,83,110,111,114,109,52,120,56,1,112,15,117,110,112,97,99,107,85,110,111,114,109,50,120,49,54,15,117,110,112,97,99,107,83,110,111,114,109,50,120,49,54,14,117,110,112,97,99,107,85,110,111,114,109,52,120,56,14,117,110,112,97,99,107,83,110,111,114,109,52,120,56,12,112,97,99,107,72,97,108,102,50,120,49,54,14,117,110,112,97,99,107,72,97,108,102,50,120,49,54,6,108,101,110,103,116,104,2,112,48,2,112,49,8,100,105,115,116,97,110,99,101,3,100,111,116,6,102,108,111,97,116,51,5,99,114,111,115,115,5,104,97,108,102,51,9,110,111,114,109,97,108,105,122,101,10,102,116,114,97,110,115,102,111,114,109,1,78,1,73,4,78,114,101,102,11,102,97,99,101,102,111,114,119,97,114,100,7,114,101,102,108,101,99,116,3,101,116,97,7,114,101,102,114,97,99,116,4,36,109,97,116,14,109,97,116,114,105,120,67,111,109,112,77,117,108,116,1,114,12,111,117,116,101,114,80,114,111,100,117,99,116,8,102,108,111,97,116,50,120,50,8,102,108,111,97,116,51,120,51,8,102,108,111,97,116,52,120,51,8,102,108,111,97,116,50,120,51,8,102,108,111,97,116,51,120,50,8,102,108,111,97,116,50,120,52,8,102,108,111,97,116,52,120,50,8,102,108,111,97,116,51,120,52,5,104,97,108,102,50,7,104,97,108,102,50,120,50,7,104,97,108,102,51,120,51,5,104,97,108,102,52,7,104,97,108,102,52,120,51,7,104,97,108,102,50,120,51,7,104,97,108,102,51,120,50,7,104,97,108,102,50,120,52,7,104,97,108,102,52,120,50,7,104,97,108,102,51,120,52,1,109,9,116,114,97,110,115,112,111,115,101,8,102,108,111,97,116,52,120,52,7,104,97,108,102,52,120,52,11,100,101,116,101,114,109,105,110,97,110,116,7,105,110,118,101,114,115,101,4,36,118,101,99,8,108,101,115,115,84,104,97,110,5,36,98,118,101,99,5,36,104,118,101,99,5,36,105,118,101,99,5,36,115,118,101,99,6,36,117,115,118,101,99,5,36,117,118,101,99,13,108,101,115,115,84,104,97,110,69,113,117,97,108,11,103,114,101,97,116,101,114,84,104,97,110,16,103,114,101,97,116,101,114,84,104,97,110,69,113,117,97,108,5,101,113,117,97,108,8,110,111,116,69,113,117,97,108,3,97,110,121,4,98,111,111,108,3,97,108,108,3,110,111,116,8,98,105,116,67,111,117,110,116,7,102,105,110,100,76,83,66,7,102,105,110,100,77,83,66,7,116,101,120,116,117,114,101,9,116,101,120,116,117,114,101,50,68,7,115,97,109,112,108,101,114,13,109,97,107,101,83,97,109,112,108,101,114,50,68,9,115,97,109,112,108,101,114,50,68,15,36,103,115,97,109,112,108,101,114,50,68,82,101,99,116,11,116,101,120,116,117,114,101,83,105,122,101,4,105,110,116,50,11,36,103,115,97,109,112,108,101,114,49,68,1,80,6,115,97,109,112,108,101,4,98,105,97,115,11,36,103,115,97,109,112,108,101,114,50,68,10,105,115,97,109,112,108,101,114,50,68,4,105,110,116,52,18,115,97,109,112,108,101,114,69,120,116,101,114,110,97,108,79,69,83,7,115,117,98,112,97,115,115,12,115,117,98,112,97,115,115,73,110,112,117,116,11,115,117,98,112,97,115,115,76,111,97,100,14,115,117,98,112,97,115,115,73,110,112,117,116,77,83,5,105,109,97,103,101,7,105,109,97,103,101,50,68,9,105,109,97,103,101,76,111,97,100,8,105,105,109,97,103,101,50,68,4,100,70,100,120,4,100,70,100,121,6,102,119,105,100,116,104,11,105,110,116,101,114,112,111,108,97,110,116,19,105,110,116,101,114,112,111,108,97,116,101,65,116,83,97,109,112,108,101,6,111,102,102,115,101,116,19,105,110,116,101,114,112,111,108,97,116,101,65,116,79,102,102,115,101,116,3,115,114,99,3,100,115,116,11,98,108,101,110,100,95,99,108,101,97,114,9,98,108,101,110,100,95,115,114,99,9,98,108,101,110,100,95,100,115,116,14,98,108,101,110,100,95,115,114,99,95,111,118,101,114,14,98,108,101,110,100,95,100,115,116,95,111,118,101,114,12,98,108,101,110,100,95,115,114,99,95,105,110,12,98,108,101,110,100,95,100,115,116,95,105,110,13,98,108,101,110,100,95,115,114,99,95,111,117,116,13,98,108,101,110,100,95,100,115,116,95,111,117,116,14,98,108,101,110,100,95,115,114,99,95,97,116,111,112,14,98,108,101,110,100,95,100,115,116,95,97,116,111,112,9,98,108,101,110,100,95,120,111,114,10,98,108,101,110,100,95,112,108,117,115,14,98,108,101,110,100,95,109,111,100,117,108,97,116,101,12,98,108,101,110,100,95,115,99,114,101,101,110,1,115,1,100,24,95,98,108,101,110,100,95,111,118,101,114,108,97,121,95,99,111,109,112,111,110,101,110,116,13,98,108,101,110,100,95,111,118,101,114,108,97,121,12,98,108,101,110,100,95,100,97,114,107,101,110,13,98,108,101,110,100,95,108,105,103,104,116,101,110,1,110,15,95,103,117,97,114,100,101,100,95,100,105,118,105,100,101,22,95,99,111,108,111,114,95,100,111,100,103,101,95,99,111,109,112,111,110,101,110,116,17,98,108,101,110,100,95,99,111,108,111,114,95,100,111,100,103,101,21,95,99,111,108,111,114,95,98,117,114,110,95,99,111,109,112,111,110,101,110,116,16,98,108,101,110,100,95,99,111,108,111,114,95,98,117,114,110,16,98,108,101,110,100,95,104,97,114,100,95,108,105,103,104,116,21,95,115,111,102,116,95,108,105,103,104,116,95,99,111,109,112,111,110,101,110,116,16,98,108,101,110,100,95,115,111,102,116,95,108,105,103,104,116,16,98,108,101,110,100,95,100,105,102,102,101,114,101,110,99,101,15,98,108,101,110,100,95,101,120,99,108,117,115,105,111,110,14,98,108,101,110,100,95,109,117,108,116,105,112,108,121,5,99,111,108,111,114,22,95,98,108,101,110,100,95,99,111,108,111,114,95,108,117,109,105,110,97,110,99,101,11,104,117,101,83,97,116,67,111,108,111,114,5,97,108,112,104,97,8,108,117,109,67,111,108,111,114,26,95,98,108,101,110,100,95,115,101,116,95,99,111,108,111,114,95,108,117,109,105,110,97,110,99,101,23,95,98,108,101,110,100,95,99,111,108,111,114,95,115,97,116,117,114,97,116,105,111,110,9,109,105,110,77,105,100,77,97,120,3,115,97,116,34,95,98,108,101,110,100,95,115,101,116,95,99,111,108,111,114,95,115,97,116,117,114,97,116,105,111,110,95,104,101,108,112,101,114,11,104,117,101,76,117,109,67,111,108,111,114,8,115,97,116,67,111,108,111,114,27,95,98,108,101,110,100,95,115,101,116,95,99,111,108,111,114,95,115,97,116,117,114,97,116,105,111,110,9,98,108,101,110,100,95,104,117,101,16,98,108,101,110,100,95,115,97,116,117,114,97,116,105,111,110,11,98,108,101,110,100,95,99,111,108,111,114,16,98,108,101,110,100,95,108,117,109,105,110,111,115,105,116,121,4,109,111,100,101,5,98,108,101,110,100,8,117,110,112,114,101,109,117,108,14,117,110,112,114,101,109,117,108,95,102,108,111,97,116,4,112,114,111,106,45,115,107,95,67,97,112,115,46,105,110,66,108,101,110,100,77,111,100,101,115,70,97,105,108,82,97,110,100,111,109,108,121,70,111,114,65,108,108,90,101,114,111,86,101,99,6,114,101,115,117,108,116,51,115,107,95,67,97,112,115,46,109,117,115,116,71,117,97,114,100,68,105,118,105,115,105,111,110,69,118,101,110,65,102,116,101,114,69,120,112,108,105,99,105,116,90,101,114,111,67,104,101,99,107,5,100,101,108,116,97,4,68,83,113,100,4,68,67,117,98,5,68,97,83,113,100,5,68,97,67,117,98,3,108,117,109,7,109,105,110,67,111,109,112,7,109,97,120,67,111,109,112,3,115,100,97,3,100,115,97,6,107,67,108,101,97,114,4,107,83,114,99,4,107,68,115,116,8,107,83,114,99,79,118,101,114,8,107,68,115,116,79,118,101,114,6,107,83,114,99,73,110,6,107,68,115,116,73,110,7,107,83,114,99,79,117,116,7,107,68,115,116,79,117,116,8,107,83,114,99,65,84,111,112,8,107,68,115,116,65,84,111,112,4,107,88,111,114,5,107,80,108,117,115,9,107,77,111,100,117,108,97,116,101,7,107,83,99,114,101,101,110,8,107,79,118,101,114,108,97,121,7,107,68,97,114,107,101,110,8,107,76,105,103,104,116,101,110,11,107,67,111,108,111,114,68,111,100,103,101,10,107,67,111,108,111,114,66,117,114,110,10,107,72,97,114,100,76,105,103,104,116,10,107,83,111,102,116,76,105,103,104,116,11,107,68,105,102,102,101,114,101,110,99,101,10,107,69,120,99,108,117,115,105,111,110,9,107,77,117,108,116,105,112,108,121,4,107,72,117,101,11,107,83,97,116,117,114,97,116,105,111,110,6,107,67,111,108,111,114,11,107,76,117,109,105,110,111,115,105,116,121,42,231,3,14,1,0,2,0,46,2,0,9,14,0,43,3,0,22,0,3,22,4,0,9,31,0,1,2,0,40,3,0,46,5,0,9,39,0,40,3,0,3,22,6,0,9,45,0,1,5,0,40,3,0,46,7,0,9,39,0,40,3,0,3,22,8,0,9,49,0,1,7,0,40,3,0,46,9,0,9,39,0,40,3,0,3,22,10,0,9,53,0,1,9,0,40,3,0,46,11,0,9,57,0,40,3,0,3,22,12,0,9,59,0,1,11,0,40,3,0,46,13,0,9,57,0,40,3,0,3,22,14,0,9,64,0,1,13,0,40,3,0,46,15,0,9,69,0,40,3,0,3,46,16,0,9,57,0,40,3,0,3,22,17,0,9,71,0,2,15,0,16,0,40,3,0,46,18,0,9,76,0,40,3,0,3,45,19,0,2,40,17,0,22,20,0,9,71,0,1,18,0,40,3,0,40,20,0,46,21,0,9,57,0,40,3,0,3,22,22,0,9,85,0,1,21,0,40,3,0,46,23,0,9,57,0,40,3,0,3,22,24,0,9,90,0,1,23,0,40,3,0,46,25,0,9,57,0,40,3,0,3,22,26,0,9,95,0,1,25,0,40,3,0,46,27,0,9,57,0,40,3,0,3,22,28,0,9,100,0,1,27,0,40,3,0,46,29,0,9,57,0,40,3,0,3,22,30,0,9,106,0,1,29,0,40,3,0,46,31,0,9,57,0,40,3,0,3,22,32,0,9,112,0,1,31,0,40,3,0,46,33,0,9,57,0,40,3,0,3,46,34,0,9,69,0,40,3,0,3,22,35,0,9,118,0,2,33,0,34,0,40,3,0,46,36,0,9,57,0,40,3,0,3,22,37,0,9,122,0,1,36,0,40,3,0,46,38,0,9,57,0,40,3,0,3,22,39,0,9,126,0,1,38,0,40,3,0,46,40,0,9,57,0,40,3,0,3,22,41,0,9,130,0,1,40,0,40,3,0,46,42,0,9,57,0,40,3,0,3,22,43,0,9,135,0,1,42,0,40,3,0,46,44,0,9,57,0,40,3,0,3,22,45,0,9,140,0,1,44,0,40,3,0,46,46,0,9,14,0,43,47,0,145,0,3,45,48,0,2,40,4,0,22,49,0,9,31,0,1,46,0,40,47,0,40,49,0,46,50,0,9,39,0,40,47,0,3,45,51,0,2,40,6,0,22,52,0,9,45,0,1,50,0,40,47,0,40,52,0,46,53,0,9,39,0,40,47,0,3,45,54,0,2,40,8,0,22,55,0,9,49,0,1,53,0,40,47,0,40,55,0,46,56,0,9,39,0,40,47,0,3,45,57,0,2,40,10,0,22,58,0,9,53,0,1,56,0,40,47,0,40,58,0,46,59,0,9,57,0,40,47,0,3,45,60,0,2,40,12,0,22,61,0,9,59,0,1,59,0,40,47,0,40,61,0,46,62,0,9,57,0,40,47,0,3,45,63,0,2,40,14,0,22,64,0,9,64,0,1,62,0,40,47,0,40,64,0,46,65,0,9,69,0,40,47,0,3,46,66,0,9,57,0,40,47,0,3,45,67,0,3,40,17,0,40,20,0,22,68,0,9,71,0,2,65,0,66,0,40,47,0,40,68,0,46,69,0,9,76,0,40,47,0,3,45,70,0,4,40,17,0,40,20,0,40,68,0,22,71,0,9,71,0,1,69,0,40,47,0,40,71,0,46,72,0,9,57,0,40,47,0,3,45,73,0,2,40,22,0,22,74,0,9,85,0,1,72,0,40,47,0,40,74,0,46,75,0,9,57,0,40,47,0,3,45,76,0,2,40,24,0,22,77,0,9,90,0,1,75,0,40,47,0,40,77,0,46,78,0,9,57,0,40,47,0,3,45,79,0,2,40,26,0,22,80,0,9,95,0,1,78,0,40,47,0,40,80,0,46,81,0,9,57,0,40,47,0,3,45,82,0,2,40,28,0,22,83,0,9,100,0,1,81,0,40,47,0,40,83,0,46,84,0,9,57,0,40,47,0,3,45,85,0,2,40,30,0,22,86,0,9,106,0,1,84,0,40,47,0,40,86,0,46,87,0,9,57,0,40,47,0,3,45,88,0,2,40,32,0,22,89,0,9,112,0,1,87,0,40,47,0,40,89,0,46,90,0,9,57,0,40,47,0,3,46,91,0,9,69,0,40,47,0,3,45,92,0,2,40,35,0,22,93,0,9,118,0,2,90,0,91,0,40,47,0,40,93,0,46,94,0,9,57,0,40,47,0,3,45,95,0,2,40,37,0,22,96,0,9,122,0,1,94,0,40,47,0,40,96,0,46,97,0,9,57,0,40,47,0,3,45,98,0,2,40,39,0,22,99,0,9,126,0,1,97,0,40,47,0,40,99,0,46,100,0,9,57,0,40,47,0,3,45,101,0,2,40,41,0,22,102,0,9,130,0,1,100,0,40,47,0,40,102,0,46,103,0,9,57,0,40,47,0,3,45,104,0,2,40,43,0,22,105,0,9,135,0,1,103,0,40,47,0,40,105,0,46,106,0,9,57,0,40,47,0,3,45,107,0,2,40,45,0,22,108,0,9,140,0,1,106,0,40,47,0,40,108,0,46,109,0,9,57,0,40,3,0,3,22,110,0,9,155,0,1,109,0,40,3,0,46,111,0,9,57,0,40,3,0,3,22,112,0,9,167,0,1,111,0,40,3,0,46,113,0,9,57,0,40,47,0,3,45,114,0,2,40,112,0,22,115,0,9,167,0,1,113,0,40,47,0,40,115,0,46,116,0,9,57,0,43,117,0,171,0,3,45,118,0,3,40,112,0,40,115,0,22,119,0,9,167,0,1,116,0,40,117,0,40,119,0,46,120,0,9,57,0,40,3,0,3,22,121,0,9,181,0,1,120,0,40,3,0,46,122,0,9,57,0,40,47,0,3,45,123,0,2,40,121,0,22,124,0,9,181,0,1,122,0,40,47,0,40,124,0,46,125,0,9,57,0,40,117,0,3,45,126,0,3,40,121,0,40,124,0,22,127,0,9,181,0,1,125,0,40,117,0,40,127,0,46,128,0,9,57,0,40,3,0,3,22,129,0,9,186,0,1,128,0,40,3,0,46,130,0,9,57,0,40,47,0,3,45,131,0,2,40,129,0,22,132,0,9,186,0,1,130,0,40,47,0,40,132,0,46,133,0,9,57,0,40,3,0,3,22,134,0,9,192,0,1,133,0,40,3,0,46,135,0,9,57,0,40,47,0,3,45,136,0,2,40,134,0,22,137,0,9,192,0,1,135,0,40,47,0,40,137,0,46,138,0,9,57,0,40,3,0,3,22,139,0,9,198,0,1,138,0,40,3,0,46,140,0,9,57,0,40,47,0,3,45,141,0,2,40,139,0,22,142,0,9,198,0,1,140,0,40,47,0,40,142,0,46,143,0,9,57,0,40,3,0,3,22,144,0,9,204,0,1,143,0,40,3,0,46,145,0,9,57,0,40,47,0,3,45,146,0,2,40,144,0,22,147,0,9,204,0,1,145,0,40,47,0,40,147,0,46,148,0,9,57,0,40,3,0,3,22,149,0,9,214,0,1,148,0,40,3,0,46,150,0,9,57,0,40,47,0,3,45,151,0,2,40,149,0,22,152,0,9,214,0,1,150,0,40,47,0,40,152,0,46,153,0,9,57,0,40,3,0,3,22,154,0,9,219,0,1,153,0,40,3,0,46,155,0,9,57,0,40,47,0,3,45,156,0,2,40,154,0,22,157,0,9,219,0,1,155,0,40,47,0,40,157,0,46,158,0,9,57,0,40,3,0,3,46,159,0,9,69,0,43,160,0,225,0,3,22,161,0,9,231,0,2,158,0,159,0,40,3,0,46,162,0,9,57,0,40,3,0,3,46,163,0,9,69,0,40,3,0,3,45,164,0,2,40,161,0,22,165,0,9,231,0,2,162,0,163,0,40,3,0,40,165,0,46,166,0,9,57,0,40,47,0,3,46,167,0,9,69,0,43,168,0,235,0,3,45,169,0,3,40,161,0,40,165,0,22,170,0,9,231,0,2,166,0,167,0,40,47,0,40,170,0,46,171,0,9,57,0,40,47,0,3,46,172,0,9,69,0,40,47,0,3,45,173,0,4,40,161,0,40,165,0,40,170,0,22,174,0,9,231,0,2,171,0,172,0,40,47,0,40,174,0,46,175,0,9,57,0,40,3,0,3,46,176,0,29,8,4,240,0,40,3,0,3,22,177,0,9,242,0,2,175,0,176,0,40,3,0,46,178,0,9,57,0,40,47,0,3,46,179,0,29,8,4,240,0,40,47,0,3,45,180,0,2,40,177,0,22,181,0,9,242,0,2,178,0,179,0,40,47,0,40,181,0,46,182,0,9,57,0,40,3,0,3,46,183,0,9,69,0,40,3,0,3,22,184,0,9,247,0,2,182,0,183,0,40,3,0,46,185,0,9,57,0,40,3,0,3,46,186,0,9,69,0,40,160,0,3,45,187,0,2,40,184,0,22,188,0,9,247,0,2,185,0,186,0,40,3,0,40,188,0,46,189,0,9,57,0,40,47,0,3,46,190,0,9,69,0,40,47,0,3,45,191,0,3,40,184,0,40,188,0,22,192,0,9,247,0,2,189,0,190,0,40,47,0,40,192,0,46,193,0,9,57,0,40,47,0,3,46,194,0,9,69,0,40,168,0,3,45,195,0,4,40,184,0,40,188,0,40,192,0,22,196,0,9,247,0,2,193,0,194,0,40,47,0,40,196,0,46,197,0,9,57,0,40,117,0,3,46,198,0,9,69,0,40,117,0,3,45,199,0,5,40,184,0,40,188,0,40,192,0,40,196,0,22,200,0,9,247,0,2,197,0,198,0,40,117,0,40,200,0,46,201,0,9,57,0,40,117,0,3,46,202,0,9,69,0,43,203,0,251,0,3,45,204,0,6,40,184,0,40,188,0,40,192,0,40,196,0,40,200,0,22,205,0,9,247,0,2,201,0,202,0,40,117,0,40,205,0,46,206,0,9,57,0,40,3,0,3,46,207,0,9,69,0,40,3,0,3,22,208,0,9,255,0,2,206,0,207,0,40,3,0,46,209,0,9,57,0,40,3,0,3,46,210,0,9,69,0,40,160,0,3,45,211,0,2,40,208,0,22,212,0,9,255,0,2,209,0,210,0,40,3,0,40,212,0,46,213,0,9,57,0,40,47,0,3,46,214,0,9,69,0,40,47,0,3,45,215,0,3,40,208,0,40,212,0,22,216,0,9,255,0,2,213,0,214,0,40,47,0,40,216,0,46,217,0,9,57,0,40,47,0,3,46,218,0,9,69,0,40,168,0,3,45,219,0,4,40,208,0,40,212,0,40,216,0,22,220,0,9,255,0,2,217,0,218,0,40,47,0,40,220,0,46,221,0,9,57,0,40,117,0,3,46,222,0,9,69,0,40,117,0,3,45,223,0,5,40,208,0,40,212,0,40,216,0,40,220,0,22,224,0,9,255,0,2,221,0,222,0,40,117,0,40,224,0,46,225,0,9,57,0,40,117,0,3,46,226,0,9,69,0,40,203,0,3,45,227,0,6,40,208,0,40,212,0,40,216,0,40,220,0,40,224,0,22,228,0,9,255,0,2,225,0,226,0,40,117,0,40,228,0,46,229,0,9,57,0,40,3,0,3,46,230,0,9,3,1,40,3,0,3,46,231,0,9,10,1,40,3,0,3,22,232,0,9,17,1,3,229,0,230,0,231,0,40,3,0,46,233,0,9,57,0,40,3,0,3,46,234,0,9,3,1,40,160,0,3,46,235,0,9,10,1,40,160,0,3,45,236,0,2,40,232,0,22,237,0,9,17,1,3,233,0,234,0,235,0,40,3,0,40,237,0,46,238,0,9,57,0,40,47,0,3,46,239,0,9,3,1,40,47,0,3,46,240,0,9,10,1,40,47,0,3,45,241,0,3,40,232,0,40,237,0,22,242,0,9,17,1,3,238,0,239,0,240,0,40,47,0,40,242,0,46,243,0,9,57,0,40,47,0,3,46,244,0,9,3,1,40,168,0,3,46,245,0,9,10,1,40,168,0,3,45,246,0,4,40,232,0,40,237,0,40,242,0,22,247,0,9,17,1,3,243,0,244,0,245,0,40,47,0,40,247,0,46,248,0,9,57,0,40,117,0,3,46,249,0,9,3,1,40,117,0,3,46,250,0,9,10,1,40,117,0,3,45,251,0,5,40,232,0,40,237,0,40,242,0,40,247,0,22,252,0,9,17,1,3,248,0,249,0,250,0,40,117,0,40,252,0,46,253,0,9,57,0,40,117,0,3,46,254,0,9,3,1,40,203,0,3,46,255,0,9,10,1,40,203,0,3,45,0,1,6,40,232,0,40,237,0,40,242,0,40,247,0,40,252,0,22,1,1,9,17,1,3,253,0,254,0,255,0,40,117,0,40,1,1,46,2,1,9,57,0,40,3,0,3,22,3,1,9,23,1,1,2,1,40,3,0,46,4,1,9,57,0,40,47,0,3,45,5,1,2,40,3,1,22,6,1,9,23,1,1,4,1,40,47,0,40,6,1,46,7,1,9,57,0,40,3,0,3,46,8,1,9,69,0,40,3,0,3,46,9,1,9,32,1,40,3,0,3,22,10,1,9,34,1,3,7,1,8,1,9,1,40,3,0,46,11,1,9,57,0,40,3,0,3,46,12,1,9,69,0,40,3,0,3,46,13,1,9,32,1,40,160,0,3,45,14,1,2,40,10,1,22,15,1,9,34,1,3,11,1,12,1,13,1,40,3,0,40,15,1,46,16,1,9,57,0,40,47,0,3,46,17,1,9,69,0,40,47,0,3,46,18,1,9,32,1,40,47,0,3,45,19,1,3,40,10,1,40,15,1,22,20,1,9,34,1,3,16,1,17,1,18,1,40,47,0,40,20,1,46,21,1,9,57,0,40,47,0,3,46,22,1,9,69,0,40,47,0,3,46,23,1,9,32,1,40,168,0,3,45,24,1,4,40,10,1,40,15,1,40,20,1,22,25,1,9,34,1,3,21,1,22,1,23,1,40,47,0,40,25,1,46,26,1,9,57,0,40,3,0,3,46,27,1,9,69,0,40,3,0,3,46,28,1,9,32,1,43,29,1,38,1,3,45,30,1,5,40,10,1,40,15,1,40,20,1,40,25,1,22,31,1,9,34,1,3,26,1,27,1,28,1,40,3,0,40,31,1,46,32,1,9,57,0,40,47,0,3,46,33,1,9,69,0,40,47,0,3,46,34,1,9,32,1,40,29,1,3,45,35,1,6,40,10,1,40,15,1,40,20,1,40,25,1,40,31,1,22,36,1,9,34,1,3,32,1,33,1,34,1,40,47,0,40,36,1,46,37,1,9,57,0,40,117,0,3,46,38,1,9,69,0,40,117,0,3,46,39,1,9,32,1,40,29,1,3,45,40,1,7,40,10,1,40,15,1,40,20,1,40,25,1,40,31,1,40,36,1,22,41,1,9,34,1,3,37,1,38,1,39,1,40,117,0,40,41,1,46,42,1,9,57,0,40,29,1,3,46,43,1,9,69,0,40,29,1,3,46,44,1,9,32,1,40,29,1,3,45,45,1,8,40,10,1,40,15,1,40,20,1,40,25,1,40,31,1,40,36,1,40,41,1,22,46,1,9,34,1,3,42,1,43,1,44,1,40,29,1,40,46,1,46,47,1,9,48,1,40,3,0,3,46,48,1,9,57,0,40,3,0,3,22,49,1,9,53,1,2,47,1,48,1,40,3,0,46,50,1,9,48,1,40,160,0,3,46,51,1,9,57,0,40,3,0,3,45,52,1,2,40,49,1,22,53,1,9,53,1,2,50,1,51,1,40,3,0,40,53,1,46,54,1,9,48,1,40,47,0,3,46,55,1,9,57,0,40,47,0,3,45,56,1,3,40,49,1,40,53,1,22,57,1,9,53,1,2,54,1,55,1,40,47,0,40,57,1,46,58,1,9,48,1,40,168,0,3,46,59,1,9,57,0,40,47,0,3,45,60,1,4,40,49,1,40,53,1,40,57,1,22,61,1,9,53,1,2,58,1,59,1,40,47,0,40,61,1,46,62,1,9,58,1,40,3,0,3,46,63,1,9,64,1,40,3,0,3,46,64,1,9,57,0,40,3,0,3,22,65,1,9,70,1,3,62,1,63,1,64,1,40,3,0,46,66,1,9,58,1,40,160,0,3,46,67,1,9,64,1,40,160,0,3,46,68,1,9,57,0,40,3,0,3,45,69,1,2,40,65,1,22,70,1,9,70,1,3,66,1,67,1,68,1,40,3,0,40,70,1,46,71,1,9,58,1,40,47,0,3,46,72,1,9,64,1,40,47,0,3,46,73,1,9,57,0,40,47,0,3,45,74,1,3,40,65,1,40,70,1,22,75,1,9,70,1,3,71,1,72,1,73,1,40,47,0,40,75,1,46,76,1,9,58,1,40,168,0,3,46,77,1,9,64,1,40,168,0,3,46,78,1,9,57,0,40,47,0,3,45,79,1,4,40,65,1,40,70,1,40,75,1,22,80,1,9,70,1,3,76,1,77,1,78,1,40,47,0,40,80,1,46,81,1,9,57,0,40,3,0,3,22,82,1,9,81,1,1,81,1,40,29,1,46,83,1,9,57,0,40,3,0,3,22,84,1,9,87,1,1,83,1,40,29,1,46,85,1,9,93,1,40,3,0,3,22,86,1,9,99,1,1,85,1,40,117,0,46,87,1,9,93,1,40,117,0,3,22,88,1,9,114,1,1,87,1,40,3,0,46,89,1,9,93,1,43,90,1,129,1,3,22,91,1,9,139,1,1,89,1,40,3,0,46,92,1,9,32,1,40,3,0,3,46,93,1,9,155,1,40,3,0,3,46,94,1,9,157,1,40,3,0,3,22,95,1,9,159,1,3,92,1,93,1,94,1,40,3,0,46,96,1,9,32,1,40,47,0,3,46,97,1,9,155,1,40,47,0,3,46,98,1,9,157,1,40,47,0,3,45,99,1,2,40,95,1,22,100,1,9,159,1,3,96,1,97,1,98,1,40,47,0,40,100,1,46,101,1,9,57,0,40,3,0,3,46,102,1,29,8,4,122,0,40,117,0,3,22,103,1,30,8,0,16,0,0,163,1,2,101,1,102,1,40,3,0,46,104,1,9,57,0,40,3,0,3,46,105,1,29,8,2,122,0,40,117,0,3,22,106,1,9,169,1,2,104,1,105,1,40,3,0,46,107,1,9,175,1,43,108,1,177,1,3,22,109,1,9,184,1,1,107,1,43,110,1,198,1,46,111,1,9,175,1,40,108,1,3,22,112,1,9,203,1,1,111,1,40,110,1,46,113,1,9,175,1,43,114,1,217,1,3,22,115,1,9,224,1,1,113,1,40,110,1,46,116,1,9,175,1,40,114,1,3,22,117,1,9,237,1,1,116,1,40,110,1,46,118,1,9,250,1,40,110,1,3,22,119,1,9,252,1,1,118,1,40,108,1,46,120,1,9,250,1,40,110,1,3,22,121,1,9,12,2,1,120,1,40,108,1,46,122,1,9,250,1,40,110,1,3,22,123,1,9,28,2,1,122,1,40,114,1,46,124,1,9,250,1,40,110,1,3,22,125,1,9,43,2,1,124,1,40,114,1,46,126,1,9,175,1,40,108,1,3,22,127,1,9,58,2,1,126,1,40,110,1,46,128,1,9,175,1,40,110,1,3,22,129,1,9,71,2,1,128,1,40,108,1,46,130,1,9,57,0,40,3,0,3,22,131,1,9,86,2,1,130,1,40,160,0,46,132,1,9,57,0,40,47,0,3,45,133,1,2,40,131,1,22,134,1,9,86,2,1,132,1,40,168,0,40,134,1,46,135,1,9,93,2,40,3,0,3,46,136,1,9,96,2,40,3,0,3,22,137,1,9,99,2,2,135,1,136,1,40,160,0,46,138,1,9,93,2,40,47,0,3,46,139,1,9,96,2,40,47,0,3,45,140,1,2,40,137,1,22,141,1,9,99,2,2,138,1,139,1,40,168,0,40,141,1,46,142,1,9,57,0,40,3,0,3,46,143,1,9,69,0,40,3,0,3,22,144,1,9,108,2,2,142,1,143,1,40,160,0,46,145,1,9,57,0,40,47,0,3,46,146,1,9,69,0,40,47,0,3,45,147,1,2,40,144,1,22,148,1,9,108,2,2,145,1,146,1,40,168,0,40,148,1,46,149,1,9,57,0,43,150,1,112,2,3,46,151,1,9,69,0,40,150,1,3,22,152,1,9,119,2,2,149,1,151,1,40,150,1,46,153,1,9,57,0,43,154,1,125,2,3,46,155,1,9,69,0,40,154,1,3,45,156,1,2,40,152,1,22,157,1,9,119,2,2,153,1,155,1,40,154,1,40,157,1,46,158,1,9,57,0,40,3,0,3,22,159,1,9,131,2,1,158,1,40,3,0,46,160,1,9,57,0,40,47,0,3,45,161,1,2,40,159,1,22,162,1,9,131,2,1,160,1,40,47,0,40,162,1,22,163,1,9,141,2,0,40,114,1,46,164,1,9,152,2,40,3,0,3,46,165,1,9,154,2,40,3,0,3,46,166,1,9,156,2,40,3,0,3,22,167,1,9,161,2,3,164,1,165,1,166,1,40,3,0,46,168,1,9,152,2,40,47,0,3,46,169,1,9,154,2,40,47,0,3,46,170,1,9,156,2,40,47,0,3,45,171,1,2,40,167,1,22,172,1,9,161,2,3,168,1,169,1,170,1,40,47,0,40,172,1,46,173,1,9,154,2,40,3,0,3,46,174,1,9,152,2,40,3,0,3,22,175,1,9,173,2,2,173,1,174,1,40,3,0,46,176,1,9,154,2,40,47,0,3,46,177,1,9,152,2,40,47,0,3,45,178,1,2,40,175,1,22,179,1,9,173,2,2,176,1,177,1,40,47,0,40,179,1,46,180,1,9,154,2,40,3,0,3,46,181,1,9,152,2,40,3,0,3,46,182,1,9,181,2,40,160,0,3,22,183,1,9,185,2,3,180,1,181,1,182,1,40,3,0,46,184,1,9,154,2,40,47,0,3,46,185,1,9,152,2,40,47,0,3,46,186,1,9,181,2,40,160,0,3,45,187,1,2,40,183,1,22,188,1,9,185,2,3,184,1,185,1,186,1,40,47,0,40,188,1,46,189,1,9,57,0,43,190,1,193,2,3,46,191,1,9,69,0,40,190,1,3,22,192,1,9,198,2,2,189,1,191,1,40,190,1,46,193,1,9,157,1,40,108,1,3,46,194,1,9,213,2,40,108,1,3,22,195,1,9,215,2,2,193,1,194,1,43,196,1,228,2,46,197,1,9,157,1,40,150,1,3,46,198,1,9,213,2,40,150,1,3,45,199,1,2,40,195,1,22,200,1,9,215,2,2,197,1,198,1,43,201,1,237,2,40,200,1,46,202,1,9,157,1,40,114,1,3,46,203,1,9,213,2,40,114,1,3,45,204,1,3,40,195,1,40,200,1,22,205,1,9,215,2,2,202,1,203,1,43,206,1,246,2,40,205,1,46,207,1,9,157,1,40,150,1,3,46,208,1,9,213,2,40,108,1,3,45,209,1,4,40,195,1,40,200,1,40,205,1,22,210,1,9,215,2,2,207,1,208,1,43,211,1,255,2,40,210,1,46,212,1,9,157,1,40,108,1,3,46,213,1,9,213,2,40,150,1,3,45,214,1,5,40,195,1,40,200,1,40,205,1,40,210,1,22,215,1,9,215,2,2,212,1,213,1,43,216,1,8,3,40,215,1,46,217,1,9,157,1,40,114,1,3,46,218,1,9,213,2,40,108,1,3,45,219,1,6,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,22,220,1,9,215,2,2,217,1,218,1,43,221,1,17,3,40,220,1,46,222,1,9,157,1,40,108,1,3,46,223,1,9,213,2,40,114,1,3,45,224,1,7,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,22,225,1,9,215,2,2,222,1,223,1,43,226,1,26,3,40,225,1,46,227,1,9,157,1,40,114,1,3,46,228,1,9,213,2,40,150,1,3,45,229,1,8,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,22,230,1,9,215,2,2,227,1,228,1,43,231,1,35,3,40,230,1,46,232,1,9,157,1,40,150,1,3,46,233,1,9,213,2,40,114,1,3,45,234,1,9,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,22,235,1,9,215,2,2,232,1,233,1,40,206,1,40,235,1,46,236,1,9,157,1,43,237,1,44,3,3,46,238,1,9,213,2,40,237,1,3,45,239,1,10,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,22,240,1,9,215,2,2,236,1,238,1,43,241,1,50,3,40,240,1,46,242,1,9,157,1,40,154,1,3,46,243,1,9,213,2,40,154,1,3,45,244,1,11,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,22,245,1,9,215,2,2,242,1,243,1,43,246,1,58,3,40,245,1,46,247,1,9,157,1,43,248,1,66,3,3,46,249,1,9,213,2,40,248,1,3,45,250,1,12,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,22,251,1,9,215,2,2,247,1,249,1,43,252,1,72,3,40,251,1,46,253,1,9,157,1,40,154,1,3,46,254,1,9,213,2,40,237,1,3,45,255,1,13,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,22,0,2,9,215,2,2,253,1,254,1,43,1,2,80,3,40,0,2,46,2,2,9,157,1,40,237,1,3,46,3,2,9,213,2,40,154,1,3,45,4,2,14,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,22,5,2,9,215,2,2,2,2,3,2,43,6,2,88,3,40,5,2,46,7,2,9,157,1,40,248,1,3,46,8,2,9,213,2,40,237,1,3,45,9,2,15,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,22,10,2,9,215,2,2,7,2,8,2,43,11,2,96,3,40,10,2,46,12,2,9,157,1,40,237,1,3,46,13,2,9,213,2,40,248,1,3,45,14,2,16,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,40,10,2,22,15,2,9,215,2,2,12,2,13,2,43,16,2,104,3,40,15,2,46,17,2,9,157,1,40,248,1,3,46,18,2,9,213,2,40,154,1,3,45,19,2,17,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,40,10,2,40,15,2,22,20,2,9,215,2,2,17,2,18,2,43,21,2,112,3,40,20,2,46,22,2,9,157,1,40,154,1,3,46,23,2,9,213,2,40,248,1,3,45,24,2,18,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,40,10,2,40,15,2,40,20,2,22,25,2,9,215,2,2,22,2,23,2,40,252,1,40,25,2,46,26,2,9,120,3,40,196,1,3,22,27,2,9,122,3,1,26,2,40,196,1,46,28,2,9,120,3,40,201,1,3,45,29,2,2,40,27,2,22,30,2,9,122,3,1,28,2,40,201,1,40,30,2,46,31,2,9,120,3,43,32,2,132,3,3,45,33,2,3,40,27,2,40,30,2,22,34,2,9,122,3,1,31,2,40,32,2,40,34,2,46,35,2,9,120,3,40,216,1,3,45,36,2,4,40,27,2,40,30,2,40,34,2,22,37,2,9,122,3,1,35,2,40,211,1,40,37,2,46,38,2,9,120,3,40,211,1,3,45,39,2,5,40,27,2,40,30,2,40,34,2,40,37,2,22,40,2,9,122,3,1,38,2,40,216,1,40,40,2,46,41,2,9,120,3,40,226,1,3,45,42,2,6,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,22,43,2,9,122,3,1,41,2,40,221,1,40,43,2,46,44,2,9,120,3,40,221,1,3,45,45,2,7,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,22,46,2,9,122,3,1,44,2,40,226,1,40,46,2,46,47,2,9,120,3,40,206,1,3,45,48,2,8,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,22,49,2,9,122,3,1,47,2,40,231,1,40,49,2,46,50,2,9,120,3,40,231,1,3,45,51,2,9,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,22,52,2,9,122,3,1,50,2,40,206,1,40,52,2,46,53,2,9,120,3,40,241,1,3,45,54,2,10,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,22,55,2,9,122,3,1,53,2,40,241,1,40,55,2,46,56,2,9,120,3,40,246,1,3,45,57,2,11,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,22,58,2,9,122,3,1,56,2,40,246,1,40,58,2,46,59,2,9,120,3,43,60,2,141,3,3,45,61,2,12,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,22,62,2,9,122,3,1,59,2,40,60,2,40,62,2,46,63,2,9,120,3,40,6,2,3,45,64,2,13,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,22,65,2,9,122,3,1,63,2,40,1,2,40,65,2,46,66,2,9,120,3,40,1,2,3,45,67,2,14,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,22,68,2,9,122,3,1,66,2,40,6,2,40,68,2,46,69,2,9,120,3,40,16,2,3,45,70,2,15,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,22,71,2,9,122,3,1,69,2,40,11,2,40,71,2,46,72,2,9,120,3,40,11,2,3,45,73,2,16,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,40,71,2,22,74,2,9,122,3,1,72,2,40,16,2,40,74,2,46,75,2,9,120,3,40,252,1,3,45,76,2,17,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,40,71,2,40,74,2,22,77,2,9,122,3,1,75,2,40,21,2,40,77,2,46,78,2,9,120,3,40,21,2,3,45,79,2,18,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,40,71,2,40,74,2,40,77,2,22,80,2,9,122,3,1,78,2,40,252,1,40,80,2,46,81,2,9,120,3,40,196,1,3,22,82,2,9,149,3,1,81,2,40,160,0,46,83,2,9,120,3,40,201,1,3,45,84,2,2,40,82,2,22,85,2,9,149,3,1,83,2,40,160,0,40,85,2,46,86,2,9,120,3,40,32,2,3,45,87,2,3,40,82,2,40,85,2,22,88,2,9,149,3,1,86,2,40,160,0,40,88,2,46,89,2,9,120,3,40,241,1,3,45,90,2,4,40,82,2,40,85,2,40,88,2,22,91,2,9,149,3,1,89,2,40,168,0,40,91,2,46,92,2,9,120,3,40,246,1,3,45,93,2,5,40,82,2,40,85,2,40,88,2,40,91,2,22,94,2,9,149,3,1,92,2,40,168,0,40,94,2,46,95,2,9,120,3,40,60,2,3,45,96,2,6,40,82,2,40,85,2,40,88,2,40,91,2,40,94,2,22,97,2,9,149,3,1,95,2,40,168,0,40,97,2,46,98,2,9,120,3,40,196,1,3,22,99,2,9,161,3,1,98,2,40,196,1,46,100,2,9,120,3,40,201,1,3,45,101,2,2,40,99,2,22,102,2,9,161,3,1,100,2,40,201,1,40,102,2,46,103,2,9,120,3,40,32,2,3,45,104,2,3,40,99,2,40,102,2,22,105,2,9,161,3,1,103,2,40,32,2,40,105,2,46,106,2,9,120,3,40,241,1,3,45,107,2,4,40,99,2,40,102,2,40,105,2,22,108,2,9,161,3,1,106,2,40,241,1,40,108,2,46,109,2,9,120,3,40,246,1,3,45,110,2,5,40,99,2,40,102,2,40,105,2,40,108,2,22,111,2,9,161,3,1,109,2,40,246,1,40,111,2,46,112,2,9,120,3,40,60,2,3,45,113,2,6,40,99,2,40,102,2,40,105,2,40,108,2,40,111,2,22,114,2,9,161,3,1,112,2,40,60,2,40,114,2,46,115,2,9,57,0,43,116,2,169,3,3,46,117,2,9,69,0,40,116,2,3,22,118,2,9,174,3,2,115,2,117,2,43,119,2,183,3,46,120,2,9,57,0,43,121,2,189,3,3,46,122,2,9,69,0,40,121,2,3,45,123,2,2,40,118,2,22,124,2,9,174,3,2,120,2,122,2,40,119,2,40,124,2,46,125,2,9,57,0,43,126,2,195,3,3,46,127,2,9,69,0,40,126,2,3,45,128,2,3,40,118,2,40,124,2,22,129,2,9,174,3,2,125,2,127,2,40,119,2,40,129,2,46,130,2,9,57,0,43,131,2,201,3,3,46,132,2,9,69,0,40,131,2,3,45,133,2,4,40,118,2,40,124,2,40,129,2,22,134,2,9,174,3,2,130,2,132,2,40,119,2,40,134,2,46,135,2,9,57,0,43,136,2,207,3,3,46,137,2,9,69,0,40,136,2,3,45,138,2,5,40,118,2,40,124,2,40,129,2,40,134,2,22,139,2,9,174,3,2,135,2,137,2,40,119,2,40,139,2,46,140,2,9,57,0,43,141,2,214,3,3,46,142,2,9,69,0,40,141,2,3,45,143,2,6,40,118,2,40,124,2,40,129,2,40,134,2,40,139,2,22,144,2,9,174,3,2,140,2,142,2,40,119,2,40,144,2,46,145,2,9,57,0,40,116,2,3,46,146,2,9,69,0,40,116,2,3,22,147,2,9,220,3,2,145,2,146,2,40,119,2,46,148,2,9,57,0,40,121,2,3,46,149,2,9,69,0,40,121,2,3,45,150,2,2,40,147,2,22,151,2,9,220,3,2,148,2,149,2,40,119,2,40,151,2,46,152,2,9,57,0,40,126,2,3,46,153,2,9,69,0,40,126,2,3,45,154,2,3,40,147,2,40,151,2,22,155,2,9,220,3,2,152,2,153,2,40,119,2,40,155,2,46,156,2,9,57,0,40,141,2,3,46,157,2,9,69,0,40,141,2,3,45,158,2,4,40,147,2,40,151,2,40,155,2,22,159,2,9,220,3,2,156,2,157,2,40,119,2,40,159,2,46,160,2,9,57,0,40,131,2,3,46,161,2,9,69,0,40,131,2,3,45,162,2,5,40,147,2,40,151,2,40,155,2,40,159,2,22,163,2,9,220,3,2,160,2,161,2,40,119,2,40,163,2,46,164,2,9,57,0,40,136,2,3,46,165,2,9,69,0,40,136,2,3,45,166,2,6,40,147,2,40,151,2,40,155,2,40,159,2,40,163,2,22,167,2,9,220,3,2,164,2,165,2,40,119,2,40,167,2,46,168,2,9,57,0,40,116,2,3,46,169,2,9,69,0,40,116,2,3,22,170,2,9,234,3,2,168,2,169,2,40,119,2,46,171,2,9,57,0,40,121,2,3,46,172,2,9,69,0,40,121,2,3,45,173,2,2,40,170,2,22,174,2,9,234,3,2,171,2,172,2,40,119,2,40,174,2,46,175,2,9,57,0,40,126,2,3,46,176,2,9,69,0,40,126,2,3,45,177,2,3,40,170,2,40,174,2,22,178,2,9,234,3,2,175,2,176,2,40,119,2,40,178,2,46,179,2,9,57,0,40,141,2,3,46,180,2,9,69,0,40,141,2,3,45,181,2,4,40,170,2,40,174,2,40,178,2,22,182,2,9,234,3,2,179,2,180,2,40,119,2,40,182,2,46,183,2,9,57,0,40,131,2,3,46,184,2,9,69,0,40,131,2,3,45,185,2,5,40,170,2,40,174,2,40,178,2,40,182,2,22,186,2,9,234,3,2,183,2,184,2,40,119,2,40,186,2,46,187,2,9,57,0,40,136,2,3,46,188,2,9,69,0,40,136,2,3,45,189,2,6,40,170,2,40,174,2,40,178,2,40,182,2,40,186,2,22,190,2,9,234,3,2,187,2,188,2,40,119,2,40,190,2,46,191,2,9,57,0,40,116,2,3,46,192,2,9,69,0,40,116,2,3,22,193,2,9,246,3,2,191,2,192,2,40,119,2,46,194,2,9,57,0,40,121,2,3,46,195,2,9,69,0,40,121,2,3,45,196,2,2,40,193,2,22,197,2,9,246,3,2,194,2,195,2,40,119,2,40,197,2,46,198,2,9,57,0,40,126,2,3,46,199,2,9,69,0,40,126,2,3,45,200,2,3,40,193,2,40,197,2,22,201,2,9,246,3,2,198,2,199,2,40,119,2,40,201,2,46,202,2,9,57,0,40,141,2,3,46,203,2,9,69,0,40,141,2,3,45,204,2,4,40,193,2,40,197,2,40,201,2,22,205,2,9,246,3,2,202,2,203,2,40,119,2,40,205,2,46,206,2,9,57,0,40,131,2,3,46,207,2,9,69,0,40,131,2,3,45,208,2,5,40,193,2,40,197,2,40,201,2,40,205,2,22,209,2,9,246,3,2,206,2,207,2,40,119,2,40,209,2,46,210,2,9,57,0,40,136,2,3,46,211,2,9,69,0,40,136,2,3,45,212,2,6,40,193,2,40,197,2,40,201,2,40,205,2,40,209,2,22,213,2,9,246,3,2,210,2,211,2,40,119,2,40,213,2,46,214,2,9,57,0,40,116,2,3,46,215,2,9,69,0,40,116,2,3,22,216,2,9,7,4,2,214,2,215,2,40,119,2,46,217,2,9,57,0,40,121,2,3,46,218,2,9,69,0,40,121,2,3,45,219,2,2,40,216,2,22,220,2,9,7,4,2,217,2,218,2,40,119,2,40,220,2,46,221,2,9,57,0,40,126,2,3,46,222,2,9,69,0,40,126,2,3,45,223,2,3,40,216,2,40,220,2,22,224,2,9,7,4,2,221,2,222,2,40,119,2,40,224,2,46,225,2,9,57,0,40,141,2,3,46,226,2,9,69,0,40,141,2,3,45,227,2,4,40,216,2,40,220,2,40,224,2,22,228,2,9,7,4,2,225,2,226,2,40,119,2,40,228,2,46,229,2,9,57,0,40,131,2,3,46,230,2,9,69,0,40,131,2,3,45,231,2,5,40,216,2,40,220,2,40,224,2,40,228,2,22,232,2,9,7,4,2,229,2,230,2,40,119,2,40,232,2,46,233,2,9,57,0,40,136,2,3,46,234,2,9,69,0,40,136,2,3,45,235,2,6,40,216,2,40,220,2,40,224,2,40,228,2,40,232,2,22,236,2,9,7,4,2,233,2,234,2,40,119,2,40,236,2,46,237,2,9,57,0,40,119,2,3,46,238,2,9,69,0,40,119,2,3,45,239,2,7,40,216,2,40,220,2,40,224,2,40,228,2,40,232,2,40,236,2,22,240,2,9,7,4,2,237,2,238,2,40,119,2,40,240,2,46,241,2,9,57,0,40,116,2,3,46,242,2,9,69,0,40,116,2,3,22,243,2,9,13,4,2,241,2,242,2,40,119,2,46,244,2,9,57,0,40,121,2,3,46,245,2,9,69,0,40,121,2,3,45,246,2,2,40,243,2,22,247,2,9,13,4,2,244,2,245,2,40,119,2,40,247,2,46,248,2,9,57,0,40,126,2,3,46,249,2,9,69,0,40,126,2,3,45,250,2,3,40,243,2,40,247,2,22,251,2,9,13,4,2,248,2,249,2,40,119,2,40,251,2,46,252,2,9,57,0,40,141,2,3,46,253,2,9,69,0,40,141,2,3,45,254,2,4,40,243,2,40,247,2,40,251,2,22,255,2,9,13,4,2,252,2,253,2,40,119,2,40,255,2,46,0,3,9,57,0,40,131,2,3,46,1,3,9,69,0,40,131,2,3,45,2,3,5,40,243,2,40,247,2,40,251,2,40,255,2,22,3,3,9,13,4,2,0,3,1,3,40,119,2,40,3,3,46,4,3,9,57,0,40,136,2,3,46,5,3,9,69,0,40,136,2,3,45,6,3,6,40,243,2,40,247,2,40,251,2,40,255,2,40,3,3,22,7,3,9,13,4,2,4,3,5,3,40,119,2,40,7,3,46,8,3,9,57,0,40,119,2,3,46,9,3,9,69,0,40,119,2,3,45,10,3,7,40,243,2,40,247,2,40,251,2,40,255,2,40,3,3,40,7,3,22,11,3,9,13,4,2,8,3,9,3,40,119,2,40,11,3,46,12,3,9,57,0,40,119,2,3,22,13,3,9,22,4,1,12,3,43,14,3,26,4,46,15,3,9,57,0,40,119,2,3,22,16,3,9,31,4,1,15,3,40,14,3,46,17,3,9,57,0,40,119,2,3,22,18,3,9,35,4,1,17,3,40,119,2,46,19,3,9,93,1,40,117,0,3,22,20,3,9,39,4,1,19,3,40,117,0,46,21,3,9,93,1,40,90,1,3,45,22,3,2,40,20,3,22,23,3,9,39,4,1,21,3,40,117,0,40,23,3,46,24,3,9,93,1,40,117,0,3,22,25,3,9,48,4,1,24,3,40,117,0,46,26,3,9,93,1,40,90,1,3,45,27,3,2,40,25,3,22,28,3,9,48,4,1,26,3,40,117,0,40,28,3,46,29,3,9,93,1,40,117,0,3,22,30,3,9,56,4,1,29,3,40,117,0,46,31,3,9,93,1,40,90,1,3,45,32,3,2,40,30,3,22,33,3,9,56,4,1,31,3,40,117,0,40,33,3,46,34,3,9,64,4,43,35,3,72,4,3,46,36,3,9,82,4,43,37,3,82,4,3,22,38,3,9,90,4,2,34,3,36,3,43,39,3,104,4,46,40,3,9,82,4,43,41,3,114,4,3,22,42,3,9,130,4,1,40,3,43,43,3,142,4,46,44,3,9,82,4,43,45,3,147,4,3,46,46,3,9,159,4,40,160,0,3,22,47,3,9,161,4,2,44,3,46,3,40,248,1,46,48,3,9,82,4,40,45,3,3,46,49,3,9,159,4,40,160,0,3,46,50,3,9,168,4,40,160,0,3,45,51,3,2,40,47,3,22,52,3,9,161,4,3,48,3,49,3,50,3,40,248,1,40,52,3,46,53,3,9,82,4,43,54,3,173,4,3,46,55,3,9,159,4,40,108,1,3,45,56,3,3,40,47,3,40,52,3,22,57,3,9,161,4,2,53,3,55,3,40,248,1,40,57,3,46,58,3,9,82,4,43,59,3,185,4,3,46,60,3,9,159,4,40,108,1,3,45,61,3,4,40,47,3,40,52,3,40,57,3,22,62,3,9,161,4,2,58,3,60,3,43,63,3,196,4,40,62,3,46,64,3,9,82,4,43,65,3,201,4,3,46,66,3,9,159,4,40,108,1,3,46,67,3,9,168,4,40,160,0,3,45,68,3,5,40,47,3,40,52,3,40,57,3,40,62,3,22,69,3,9,161,4,3,64,3,66,3,67,3,40,248,1,40,69,3,46,70,3,9,82,4,40,65,3,3,46,71,3,9,159,4,40,108,1,3,45,72,3,6,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,22,73,3,9,161,4,2,70,3,71,3,40,248,1,40,73,3,46,74,3,9,82,4,40,41,3,3,46,75,3,9,159,4,40,108,1,3,45,76,3,7,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,22,77,3,9,161,4,2,74,3,75,3,40,248,1,40,77,3,46,78,3,9,82,4,40,41,3,3,46,79,3,9,159,4,40,150,1,3,45,80,3,8,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,22,81,3,9,161,4,2,78,3,79,3,40,248,1,40,81,3,46,82,3,9,220,4,43,83,3,228,4,3,22,84,3,9,241,4,1,82,3,40,248,1,46,85,3,9,220,4,43,86,3,253,4,3,46,87,3,9,161,4,40,203,0,3,45,88,3,2,40,84,3,22,89,3,9,241,4,2,85,3,87,3,40,248,1,40,89,3,46,90,3,9,82,4,40,45,3,3,46,91,3,9,159,4,40,108,1,3,45,92,3,9,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,22,93,3,9,161,4,2,90,3,91,3,40,248,1,40,93,3,46,94,3,9,82,4,40,45,3,3,46,95,3,9,159,4,40,108,1,3,46,96,3,9,168,4,40,160,0,3,45,97,3,10,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,40,93,3,22,98,3,9,161,4,3,94,3,95,3,96,3,40,248,1,40,98,3,46,99,3,9,82,4,40,54,3,3,46,100,3,9,159,4,40,150,1,3,45,101,3,11,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,40,93,3,40,98,3,22,102,3,9,161,4,2,99,3,100,3,40,248,1,40,102,3,46,103,3,9,82,4,40,54,3,3,46,104,3,9,159,4,40,150,1,3,46,105,3,9,168,4,40,160,0,3,45,106,3,12,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,40,93,3,40,98,3,40,102,3,22,107,3,9,161,4,3,103,3,104,3,105,3,40,248,1,40,107,3,46,108,3,9,12,5,43,109,3,18,5,3,46,110,3,9,159,4,40,43,3,3,22,111,3,9,26,5,2,108,3,110,3,40,114,1,46,112,3,9,12,5,43,113,3,36,5,3,46,114,3,9,159,4,40,43,3,3,45,115,3,2,40,111,3,22,116,3,9,26,5,2,112,3,114,3,40,63,3,40,116,3,46,117,3,9,250,1,40,3,0,3,22,118,3,9,45,5,1,117,3,40,3,0,46,119,3,9,250,1,40,3,0,3,22,120,3,9,50,5,1,119,3,40,3,0,46,121,3,9,250,1,40,47,0,3,45,122,3,2,40,118,3,22,123,3,9,45,5,1,121,3,40,47,0,40,123,3,46,124,3,9,250,1,40,47,0,3,45,125,3,2,40,120,3,22,126,3,9,50,5,1,124,3,40,47,0,40,126,3,46,127,3,9,250,1,40,3,0,3,22,128,3,9,55,5,1,127,3,40,3,0,46,129,3,9,250,1,40,47,0,3,45,130,3,2,40,128,3,22,131,3,9,55,5,1,129,3,40,47,0,40,131,3,46,132,3,9,62,5,40,160,0,3,46,133,3,9,161,4,40,203,0,3,22,134,3,9,74,5,2,132,3,133,3,40,160,0,46,135,3,9,62,5,40,108,1,3,46,136,3,9,161,4,40,203,0,3,45,137,3,2,40,134,3,22,138,3,9,74,5,2,135,3,136,3,40,108,1,40,138,3,46,139,3,9,62,5,40,150,1,3,46,140,3,9,161,4,40,203,0,3,45,141,3,3,40,134,3,40,138,3,22,142,3,9,74,5,2,139,3,140,3,40,150,1,40,142,3,46,143,3,9,62,5,40,114,1,3,46,144,3,9,161,4,40,203,0,3,45,145,3,4,40,134,3,40,138,3,40,142,3,22,146,3,9,74,5,2,143,3,144,3,40,114,1,40,146,3,46,147,3,9,62,5,40,160,0,3,46,148,3,9,94,5,40,108,1,3,22,149,3,9,101,5,2,147,3,148,3,40,160,0,46,150,3,9,62,5,40,108,1,3,46,151,3,9,94,5,40,108,1,3,45,152,3,2,40,149,3,22,153,3,9,101,5,2,150,3,151,3,40,108,1,40,153,3,46,154,3,9,62,5,40,150,1,3,46,155,3,9,94,5,40,108,1,3,45,156,3,3,40,149,3,40,153,3,22,157,3,9,101,5,2,154,3,155,3,40,150,1,40,157,3,46,158,3,9,62,5,40,114,1,3,46,159,3,9,94,5,40,108,1,3,45,160,3,4,40,149,3,40,153,3,40,157,3,22,161,3,9,101,5,2,158,3,159,3,40,114,1,40,161,3,46,162,3,9,121,5,40,248,1,3,46,163,3,9,125,5,40,248,1,3,22,164,3,9,129,5,2,162,3,163,3,40,248,1,46,165,3,9,121,5,40,248,1,3,46,166,3,9,125,5,40,248,1,3,22,167,3,9,141,5,2,165,3,166,3,40,248,1,46,168,3,9,121,5,40,248,1,3,46,169,3,9,125,5,40,248,1,3,22,170,3,9,151,5,2,168,3,169,3,40,248,1,46,171,3,9,121,5,40,248,1,3,46,172,3,9,125,5,40,248,1,3,22,173,3,9,161,5,2,171,3,172,3,40,248,1,46,174,3,9,121,5,40,248,1,3,46,175,3,9,125,5,40,248,1,3,22,176,3,9,176,5,2,174,3,175,3,40,248,1,46,177,3,9,121,5,40,248,1,3,46,178,3,9,125,5,40,248,1,3,22,179,3,9,191,5,2,177,3,178,3,40,248,1,46,180,3,9,121,5,40,248,1,3,46,181,3,9,125,5,40,248,1,3,22,182,3,9,204,5,2,180,3,181,3,40,248,1,46,183,3,9,121,5,40,248,1,3,46,184,3,9,125,5,40,248,1,3,22,185,3,9,217,5,2,183,3,184,3,40,248,1,46,186,3,9,121,5,40,248,1,3,46,187,3,9,125,5,40,248,1,3,22,188,3,9,231,5,2,186,3,187,3,40,248,1,46,189,3,9,121,5,40,248,1,3,46,190,3,9,125,5,40,248,1,3,22,191,3,9,245,5,2,189,3,190,3,40,248,1,46,192,3,9,121,5,40,248,1,3,46,193,3,9,125,5,40,248,1,3,22,194,3,9,4,6,2,192,3,193,3,40,248,1,46,195,3,9,121,5,40,248,1,3,46,196,3,9,125,5,40,248,1,3,22,197,3,9,19,6,2,195,3,196,3,40,248,1,46,198,3,9,121,5,40,248,1,3,46,199,3,9,125,5,40,248,1,3,22,200,3,9,29,6,2,198,3,199,3,40,248,1,46,201,3,9,121,5,40,248,1,3,46,202,3,9,125,5,40,248,1,3,22,203,3,9,40,6,2,201,3,202,3,40,248,1,46,204,3,9,121,5,40,248,1,3,46,205,3,9,125,5,40,248,1,3,22,206,3,9,55,6,2,204,3,205,3,40,248,1,46,207,3,9,68,6,40,237,1,3,46,208,3,9,70,6,40,237,1,3,22,209,3,9,72,6,2,207,3,208,3,40,168,0,46,210,3,9,121,5,40,248,1,3,46,211,3,9,125,5,40,248,1,3,22,212,3,9,97,6,2,210,3,211,3,40,248,1,46,213,3,9,121,5,40,248,1,3,46,214,3,9,125,5,40,248,1,3,22,215,3,9,111,6,2,213,3,214,3,40,248,1,46,216,3,9,121,5,40,248,1,3,46,217,3,9,125,5,40,248,1,3,22,218,3,9,124,6,2,216,3,217,3,40,248,1,46,219,3,9,138,6,40,168,0,3,46,220,3,9,70,6,40,168,0,3,22,221,3,9,140,6,2,219,3,220,3,40,168,0,46,222,3,9,68,6,40,237,1,3,46,223,3,9,70,6,40,237,1,3,22,224,3,9,156,6,2,222,3,223,3,40,168,0,46,225,3,9,121,5,40,248,1,3,46,226,3,9,125,5,40,248,1,3,22,227,3,9,179,6,2,225,3,226,3,40,248,1,46,228,3,9,68,6,40,237,1,3,46,229,3,9,70,6,40,237,1,3,22,230,3,9,197,6,2,228,3,229,3,40,168,0,46,231,3,9,121,5,40,248,1,3,46,232,3,9,125,5,40,248,1,3,22,233,3,9,219,6,2,231,3,232,3,40,248,1,46,234,3,9,121,5,40,248,1,3,46,235,3,9,125,5,40,248,1,3,22,236,3,9,236,6,2,234,3,235,3,40,248,1,46,237,3,9,68,6,40,237,1,3,46,238,3,9,70,6,40,237,1,3,22,239,3,9,253,6,2,237,3,238,3,40,168,0,46,240,3,9,121,5,40,248,1,3,46,241,3,9,125,5,40,248,1,3,22,242,3,9,19,7,2,240,3,241,3,40,248,1,46,243,3,9,121,5,40,248,1,3,46,244,3,9,125,5,40,248,1,3,22,245,3,9,36,7,2,243,3,244,3,40,248,1,46,246,3,9,121,5,40,248,1,3,46,247,3,9,125,5,40,248,1,3,22,248,3,9,53,7,2,246,3,247,3,40,248,1,46,249,3,9,121,5,40,248,1,3,46,250,3,9,125,5,40,248,1,3,22,251,3,9,69,7,2,249,3,250,3,40,248,1,46,252,3,9,84,7,40,154,1,3,22,253,3,9,90,7,1,252,3,40,168,0,46,254,3,9,113,7,40,154,1,3,46,255,3,9,125,7,40,168,0,3,46,0,4,9,131,7,40,154,1,3,22,1,4,9,140,7,3,254,3,255,3,0,4,40,154,1,46,2,4,9,84,7,40,154,1,3,22,3,4,9,167,7,1,2,4,40,168,0,46,4,4,9,191,7,40,154,1,3,46,5,4,9,201,7,40,168,0,3,22,6,4,9,205,7,2,4,4,5,4,40,154,1,46,7,4,9,240,7,40,154,1,3,46,8,4,9,252,7,40,154,1,3,22,9,4,9,5,8,2,7,4,8,4,40,154,1,46,10,4,9,121,5,40,248,1,3,46,11,4,9,125,5,40,248,1,3,22,12,4,9,33,8,2,10,4,11,4,40,248,1,46,13,4,9,121,5,40,248,1,3,46,14,4,9,125,5,40,248,1,3,22,15,4,9,43,8,2,13,4,14,4,40,248,1,46,16,4,9,121,5,40,248,1,3,46,17,4,9,125,5,40,248,1,3,22,18,4,9,60,8,2,16,4,17,4,40,248,1,46,19,4,9,121,5,40,248,1,3,46,20,4,9,125,5,40,248,1,3,22,21,4,9,72,8,2,19,4,20,4,40,248,1,46,22,4,9,89,8,40,1,0,3,46,23,4,9,121,5,40,248,1,3,46,24,4,9,125,5,40,248,1,3,22,25,4,9,94,8,3,22,4,23,4,24,4,40,248,1,46,26,4,9,84,7,40,248,1,3,22,27,4,9,100,8,1,26,4,40,248,1,46,28,4,9,84,7,40,114,1,3,22,29,4,9,109,8,1,28,4,40,114,1,46,30,4,9,250,1,40,150,1,3,22,31,4,9,124,8,1,30,4,40,108,1,135,0,2,0,0,0,90,7,196,3,167,7,202,3,72,6,152,3,140,7,200,3,5,8,208,3,205,7,205,3,197,6,173,3,156,6,167,3,140,6,164,3,253,6,182,3,167,0,114,0,64,0,60,0,106,0,82,0,31,4,229,2,22,4,227,2,59,0,57,0,100,0,79,0,71,0,67,0,112,0,85,0,39,4,235,2,94,8,224,3,129,5,107,3,60,8,217,3,219,6,176,3,179,6,170,3,111,6,158,3,36,7,188,3,151,5,113,3,4,6,137,3,204,5,125,3,231,5,131,3,176,5,119,3,53,7,191,3,236,6,179,3,33,8,211,3,124,6,161,3,72,8,220,3,40,6,146,3,69,7,194,3,97,6,155,3,29,6,143,3,43,8,214,3,55,6,149,3,19,7,185,3,141,5,110,3,245,5,134,3,191,5,122,3,217,5,128,3,161,5,116,3,19,6,140,3,214,0,147,0,17,1,249,0,49,0,51,0,90,0,73,0,119,2,142,1,45,5,65,3,50,5,68,3,149,3,61,2,99,2,128,1,108,2,135,1,7,4,197,2,122,0,92,0,130,0,98,0,161,2,157,1,48,4,240,2,56,4,245,2,99,1,78,1,186,0,127,0,159,1,90,1,219,0,152,0,163,1,94,1,141,2,149,1,55,5,73,3,234,3,147,2,246,3,170,2,26,5,58,3,114,1,80,1,101,5,103,3,74,5,88,3,161,3,78,2,155,0,107,0,87,1,76,1,81,1,74,1,169,1,97,1,86,2,121,1,174,3,101,2,220,3,124,2,126,0,95,0,135,0,101,0,90,4,249,2,198,2,177,1,255,0,220,0,247,0,197,0,34,1,37,1,231,0,167,0,242,0,174,0,131,2,147,1,35,4,231,2,13,4,224,2,215,2,247,1,58,2,115,1,203,1,101,1,237,1,105,1,184,1,99,1,224,1,103,1,118,0,89,0,124,8,230,3,31,0,45,0,173,2,164,1,185,2,173,1,198,0,137,0,204,0,142,0,161,4,51,3,23,1,254,0,181,0,122,0,45,0,48,0,85,0,70,0,70,1,71,1,140,0,104,0,53,1,52,1,241,4,33,3,53,0,54,0,95,0,76,0,130,4,251,2,122,3,44,2,192,0,132,0,139,1,82,1,71,2,117,1,12,2,109,1,43,2,113,1,252,1,107,1,28,2,111,1,100,8,226,3,109,8,228,3,12,44,21,164,3,2,42,0,0,0,0,1,35,6,40,248,1,1,18,0,0,0,0,1,0,21,167,3,2,42,0,0,0,0,1,35,49,165,3,0,1,0,21,170,3,2,42,0,0,0,0,1,35,49,169,3,0,1,0,21,173,3,2,42,0,0,0,0,1,35,1,49,171,3,0,57,1,1,18,0,0,128,63,58,39,49,171,3,0,1,3,40,168,0,59,49,172,3,0,40,248,1,40,248,1,1,0,21,176,3,2,42,0,0,0,0,1,35,1,1,1,18,0,0,128,63,58,39,49,175,3,0,1,3,40,168,0,59,49,174,3,0,40,248,1,57,49,175,3,0,40,248,1,1,0,21,179,3,2,42,0,0,0,0,1,35,44,36,129,8,3,0,44,1,49,177,3,0,76,6,40,248,1,1,18,0,0,0,0,40,14,3,6,40,248,1,1,18,0,0,0,0,1,49,177,3,0,59,39,49,178,3,0,1,3,40,248,1,1,49,177,3,0,59,39,49,178,3,0,1,3,40,248,1,1,0,21,182,3,2,42,0,0,0,0,1,35,20,40,248,1,179,3,2,49,181,3,0,49,180,3,0,1,1,179,3,21,185,3,2,42,0,0,0,0,1,35,1,1,18,0,0,128,63,58,39,49,184,3,0,1,3,40,168,0,59,49,183,3,0,40,248,1,1,0,21,188,3,2,42,0,0,0,0,1,35,1,1,18,0,0,128,63,58,39,49,186,3,0,1,3,40,168,0,59,49,187,3,0,40,248,1,1,0,21,191,3,2,42,0,0,0,0,1,35,1,1,39,49,190,3,0,1,3,59,49,189,3,0,40,248,1,57,1,1,18,0,0,128,63,58,39,49,189,3,0,1,3,40,168,0,59,49,190,3,0,40,248,1,40,248,1,1,0,21,194,3,2,42,0,0,0,0,1,35,1,1,1,18,0,0,128,63,58,39,49,193,3,0,1,3,40,168,0,59,49,192,3,0,40,248,1,57,1,39,49,192,3,0,1,3,59,49,193,3,0,40,248,1,40,248,1,1,0,21,197,3,2,42,0,0,0,0,1,35,1,1,1,18,0,0,128,63,58,39,49,196,3,0,1,3,40,168,0,59,49,195,3,0,40,248,1,57,1,1,18,0,0,128,63,58,39,49,195,3,0,1,3,40,168,0,59,49,196,3,0,40,248,1,40,248,1,1,0,21,200,3,2,42,0,0,0,0,1,35,20,40,248,1,196,0,2,1,49,198,3,0,57,49,199,3,0,40,248,1,18,0,0,128,63,1,0,21,203,3,2,42,0,0,0,0,1,35,1,49,201,3,0,59,49,202,3,0,40,248,1,1,0,21,206,3,2,42,0,0,0,0,1,35,1,49,204,3,0,57,1,1,18,0,0,128,63,58,49,204,3,0,40,248,1,59,49,205,3,0,40,248,1,40,248,1,1,0,21,209,3,2,42,0,0,0,0,1,35,44,1,1,18,0,0,0,64,59,39,49,208,3,0,1,0,40,168,0,81,39,49,208,3,0,1,1,40,14,3,1,1,18,0,0,0,64,59,39,49,207,3,0,1,0,40,168,0,59,39,49,208,3,0,1,0,40,168,0,1,1,39,49,207,3,0,1,1,59,39,49,208,3,0,1,1,40,168,0,58,1,1,18,0,0,0,64,59,1,39,49,208,3,0,1,1,58,39,49,208,3,0,1,0,40,168,0,40,168,0,59,1,39,49,207,3,0,1,1,58,39,49,207,3,0,1,0,40,168,0,40,168,0,40,168,0,1,0,21,212,3,2,42,1,0,46,32,4,9,175,8,40,248,1,2,1,0,175,8,0,0,3,48,40,248,1,1,47,32,4,0,6,40,248,1,4,20,40,168,0,209,3,2,39,49,210,3,0,2,0,3,39,49,211,3,0,2,0,3,20,40,168,0,209,3,2,39,49,210,3,0,2,1,3,39,49,211,3,0,2,1,3,20,40,168,0,209,3,2,39,49,210,3,0,2,2,3,39,49,211,3,0,2,2,3,1,39,49,210,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,210,3,0,1,3,40,168,0,59,39,49,211,3,0,1,3,40,168,0,40,168,0,15,1,39,49,32,4,2,3,0,1,2,82,1,1,39,49,211,3,0,3,0,1,2,59,1,18,0,0,128,63,58,39,49,210,3,0,1,3,40,168,0,40,154,1,57,1,39,49,210,3,0,3,0,1,2,59,1,18,0,0,128,63,58,39,49,211,3,0,1,3,40,168,0,40,154,1,40,154,1,40,154,1,35,49,32,4,0,1,1,209,3,21,215,3,2,42,1,0,46,33,4,9,175,8,40,248,1,2,1,0,175,8,0,0,3,48,40,248,1,1,47,33,4,0,20,40,248,1,173,3,2,49,213,3,0,49,214,3,0,15,1,39,49,33,4,1,3,0,1,2,75,20,40,154,1,192,0,2,39,49,33,4,0,3,0,1,2,1,1,1,18,0,0,128,63,58,39,49,214,3,0,1,3,40,168,0,59,39,49,213,3,0,3,0,1,2,40,154,1,57,39,49,214,3,0,3,0,1,2,40,154,1,40,154,1,35,49,33,4,0,1,1,173,3,21,218,3,2,42,1,0,46,34,4,9,175,8,40,248,1,2,1,0,175,8,0,0,3,48,40,248,1,1,47,34,4,0,20,40,248,1,173,3,2,49,216,3,0,49,217,3,0,15,1,39,49,34,4,1,3,0,1,2,75,20,40,154,1,216,0,2,39,49,34,4,0,3,0,1,2,1,1,1,18,0,0,128,63,58,39,49,217,3,0,1,3,40,168,0,59,39,49,216,3,0,3,0,1,2,40,154,1,57,39,49,217,3,0,3,0,1,2,40,154,1,40,154,1,35,49,34,4,0,1,1,173,3,21,221,3,2,42,0,0,0,0,1,35,44,36,182,8,3,0,1,49,219,3,0,60,1,49,220,3,0,57,18,119,204,43,50,40,168,0,40,168,0,1,49,219,3,0,60,49,220,3,0,40,168,0,1,0,21,224,3,2,42,0,0,0,0,1,23,0,1,39,49,223,3,0,1,0,76,18,0,0,0,0,40,14,3,2,42,0,0,0,0,1,35,1,39,49,222,3,0,1,0,59,1,18,0,0,128,63,58,39,49,223,3,0,1,1,40,168,0,40,168,0,1,2,42,1,0,46,35,4,9,234,8,40,168,0,2,1,0,234,8,0,0,2,48,40,168,0,1,47,35,4,0,1,39,49,222,3,0,1,1,58,39,49,222,3,0,1,0,40,168,0,23,0,1,49,35,4,0,76,18,0,0,0,0,40,14,3,2,42,0,0,0,0,1,35,1,1,1,39,49,222,3,0,1,1,59,39,49,223,3,0,1,1,40,168,0,57,1,39,49,222,3,0,1,0,59,1,18,0,0,128,63,58,39,49,223,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,223,3,0,1,0,59,1,18,0,0,128,63,58,39,49,222,3,0,1,1,40,168,0,40,168,0,40,168,0,1,2,42,0,0,0,0,2,15,1,49,35,4,1,75,20,40,168,0,192,0,2,39,49,223,3,0,1,1,20,40,168,0,221,3,2,1,39,49,223,3,0,1,0,59,39,49,222,3,0,1,1,40,168,0,49,35,4,0,40,168,0,35,1,1,1,49,35,4,0,59,39,49,222,3,0,1,1,40,168,0,57,1,39,49,222,3,0,1,0,59,1,18,0,0,128,63,58,39,49,223,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,223,3,0,1,0,59,1,18,0,0,128,63,58,39,49,222,3,0,1,1,40,168,0,40,168,0,40,168,0,1,1,1,1,221,3,21,227,3,2,42,0,0,0,0,1,35,6,40,248,1,4,20,40,168,0,224,3,2,39,49,225,3,0,2,0,3,39,49,226,3,0,2,0,3,20,40,168,0,224,3,2,39,49,225,3,0,2,1,3,39,49,226,3,0,2,1,3,20,40,168,0,224,3,2,39,49,225,3,0,2,2,3,39,49,226,3,0,2,2,3,1,39,49,225,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,225,3,0,1,3,40,168,0,59,39,49,226,3,0,1,3,40,168,0,40,168,0,1,1,224,3,21,230,3,2,42,0,0,0,0,1,23,0,1,39,49,229,3,0,1,1,76,39,49,229,3,0,1,0,40,14,3,2,42,0,0,0,0,1,35,1,1,1,39,49,228,3,0,1,1,59,39,49,229,3,0,1,1,40,168,0,57,1,39,49,228,3,0,1,0,59,1,18,0,0,128,63,58,39,49,229,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,229,3,0,1,0,59,1,18,0,0,128,63,58,39,49,228,3,0,1,1,40,168,0,40,168,0,40,168,0,1,23,0,1,39,49,228,3,0,1,0,76,18,0,0,0,0,40,14,3,2,42,0,0,0,0,1,35,1,39,49,229,3,0,1,0,59,1,18,0,0,128,63,58,39,49,228,3,0,1,1,40,168,0,40,168,0,1,2,42,1,0,46,36,4,9,234,8,40,168,0,2,1,0,234,8,0,0,2,48,40,168,0,1,47,36,4,0,20,40,168,0,216,0,2,18,0,0,0,0,1,39,49,229,3,0,1,1,58,20,40,168,0,221,3,2,1,1,39,49,229,3,0,1,1,58,39,49,229,3,0,1,0,40,168,0,59,39,49,228,3,0,1,1,40,168,0,39,49,228,3,0,1,0,40,168,0,35,1,1,1,49,36,4,0,59,39,49,228,3,0,1,1,40,168,0,57,1,39,49,228,3,0,1,0,59,1,18,0,0,128,63,58,39,49,229,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,229,3,0,1,0,59,1,18,0,0,128,63,58,39,49,228,3,0,1,1,40,168,0,40,168,0,40,168,0,1,1,1,221,3,21,233,3,2,42,0,0,0,0,1,35,6,40,248,1,4,20,40,168,0,230,3,2,39,49,231,3,0,2,0,3,39,49,232,3,0,2,0,3,20,40,168,0,230,3,2,39,49,231,3,0,2,1,3,39,49,232,3,0,2,1,3,20,40,168,0,230,3,2,39,49,231,3,0,2,2,3,39,49,232,3,0,2,2,3,1,39,49,231,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,231,3,0,1,3,40,168,0,59,39,49,232,3,0,1,3,40,168,0,40,168,0,1,1,230,3,21,236,3,2,42,0,0,0,0,1,35,20,40,248,1,212,3,2,49,235,3,0,49,234,3,0,1,1,212,3,21,239,3,2,42,0,0,0,0,1,23,0,1,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,81,39,49,237,3,0,1,1,40,14,3,2,42,0,0,0,0,1,35,1,1,20,40,168,0,221,3,2,1,1,39,49,238,3,0,1,0,59,39,49,238,3,0,1,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,39,49,238,3,0,1,1,57,1,1,18,0,0,128,63,58,39,49,238,3,0,1,1,40,168,0,59,39,49,237,3,0,1,0,40,168,0,40,168,0,57,1,39,49,238,3,0,1,0,59,1,1,34,58,39,49,237,3,0,1,1,57,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,57,18,0,0,128,63,40,168,0,40,168,0,40,168,0,1,23,0,1,1,18,0,0,128,64,59,39,49,238,3,0,1,0,40,168,0,81,39,49,238,3,0,1,1,40,14,3,2,42,4,0,46,37,4,9,240,8,40,168,0,2,46,38,4,9,245,8,40,168,0,2,46,39,4,9,250,8,40,168,0,2,46,40,4,9,0,9,40,168,0,2,4,0,245,8,1,0,240,8,0,0,0,9,3,0,250,8,2,0,5,48,40,168,0,1,47,37,4,0,1,39,49,238,3,0,1,0,59,39,49,238,3,0,1,0,40,168,0,48,40,168,0,1,47,38,4,0,1,49,37,4,0,59,39,49,238,3,0,1,0,40,168,0,48,40,168,0,1,47,39,4,0,1,39,49,238,3,0,1,1,59,39,49,238,3,0,1,1,40,168,0,48,40,168,0,1,47,40,4,0,1,49,39,4,0,59,39,49,238,3,0,1,1,40,168,0,35,20,40,168,0,221,3,2,1,1,1,1,49,39,4,0,59,1,39,49,237,3,0,1,0,58,1,39,49,238,3,0,1,0,59,1,1,1,18,0,0,64,64,59,39,49,237,3,0,1,1,40,168,0,58,1,18,0,0,192,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,58,18,0,0,128,63,40,168,0,40,168,0,40,168,0,40,168,0,57,1,1,1,18,0,0,64,65,59,39,49,238,3,0,1,1,40,168,0,59,49,37,4,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,40,168,0,58,1,1,18,0,0,128,65,59,49,38,4,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,40,168,0,58,1,49,40,4,0,59,39,49,237,3,0,1,0,40,168,0,40,168,0,49,39,4,0,1,2,42,0,0,0,0,1,35,1,1,1,1,39,49,238,3,0,1,0,59,1,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,57,18,0,0,128,63,40,168,0,40,168,0,57,39,49,237,3,0,1,0,40,168,0,58,1,20,40,168,0,108,0,1,1,39,49,238,3,0,1,1,59,39,49,238,3,0,1,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,40,168,0,58,1,39,49,238,3,0,1,1,59,39,49,237,3,0,1,0,40,168,0,40,168,0,1,1,1,221,3,21,242,3,2,42,0,0,0,0,1,35,44,1,39,49,241,3,0,1,3,76,18,0,0,0,0,40,14,3,49,240,3,0,6,40,248,1,4,20,40,168,0,239,3,2,39,49,240,3,0,2,0,3,39,49,241,3,0,2,0,3,20,40,168,0,239,3,2,39,49,240,3,0,2,1,3,39,49,241,3,0,2,1,3,20,40,168,0,239,3,2,39,49,240,3,0,2,2,3,39,49,241,3,0,2,2,3,1,39,49,240,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,240,3,0,1,3,40,168,0,59,39,49,241,3,0,1,3,40,168,0,40,168,0,1,1,239,3,21,245,3,2,42,0,0,0,0,1,35,6,40,248,1,2,1,1,39,49,243,3,0,3,0,1,2,57,39,49,244,3,0,3,0,1,2,40,154,1,58,1,18,0,0,0,64,59,20,40,154,1,192,0,2,1,39,49,243,3,0,3,0,1,2,59,39,49,244,3,0,1,3,40,154,1,1,39,49,244,3,0,3,0,1,2,59,39,49,243,3,0,1,3,40,154,1,40,154,1,40,154,1,1,39,49,243,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,243,3,0,1,3,40,168,0,59,39,49,244,3,0,1,3,40,168,0,40,168,0,1,0,21,248,3,2,42,0,0,0,0,1,35,6,40,248,1,2,1,1,39,49,247,3,0,3,0,1,2,57,39,49,246,3,0,3,0,1,2,40,154,1,58,1,1,18,0,0,0,64,59,39,49,247,3,0,3,0,1,2,40,154,1,59,39,49,246,3,0,3,0,1,2,40,154,1,40,154,1,1,39,49,246,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,246,3,0,1,3,40,168,0,59,39,49,247,3,0,1,3,40,168,0,40,168,0,1,0,21,251,3,2,42,0,0,0,0,1,35,6,40,248,1,2,1,1,1,1,18,0,0,128,63,58,39,49,249,3,0,1,3,40,168,0,59,39,49,250,3,0,3,0,1,2,40,154,1,57,1,1,18,0,0,128,63,58,39,49,250,3,0,1,3,40,168,0,59,39,49,249,3,0,3,0,1,2,40,154,1,40,154,1,57,1,39,49,249,3,0,3,0,1,2,59,39,49,250,3,0,3,0,1,2,40,154,1,40,154,1,1,39,49,249,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,249,3,0,1,3,40,168,0,59,39,49,250,3,0,1,3,40,168,0,40,168,0,1,0,21,253,3,2,42,0,0,0,0,1,35,20,40,168,0,148,1,2,6,40,154,1,3,18,154,153,153,62,18,61,10,23,63,18,174,71,225,61,49,252,3,0,1,0,21,1,4,2,42,4,0,46,41,4,9,6,9,40,168,0,2,46,42,4,9,175,8,40,154,1,2,46,43,4,9,10,9,40,168,0,2,46,44,4,9,18,9,40,168,0,2,4,0,6,9,0,0,18,9,3,0,10,9,2,0,175,8,1,0,6,48,40,168,0,1,47,41,4,0,20,40,168,0,253,3,1,49,0,4,0,48,40,154,1,1,47,42,4,0,1,1,49,41,4,0,58,20,40,168,0,253,3,1,49,254,3,0,40,168,0,57,49,254,3,0,40,154,1,48,40,168,0,1,47,43,4,0,20,40,168,0,192,0,2,20,40,168,0,192,0,2,39,49,42,4,0,1,0,39,49,42,4,0,1,1,39,49,42,4,0,1,2,48,40,168,0,1,47,44,4,0,20,40,168,0,216,0,2,20,40,168,0,216,0,2,39,49,42,4,0,1,0,39,49,42,4,0,1,1,39,49,42,4,0,1,2,23,0,1,1,49,43,4,0,79,18,0,0,0,0,40,14,3,70,1,49,41,4,0,77,49,43,4,0,40,14,3,40,14,3,2,42,0,0,0,0,1,15,1,49,42,4,1,75,1,49,41,4,0,57,1,1,1,49,42,4,0,58,49,41,4,0,40,154,1,59,49,41,4,0,40,154,1,60,1,49,41,4,0,58,49,43,4,0,40,168,0,40,154,1,40,154,1,40,154,1,1,50,35,44,1,1,49,44,4,0,78,49,255,3,0,40,14,3,70,1,49,44,4,0,77,49,41,4,0,40,14,3,40,14,3,1,49,41,4,0,57,1,1,1,49,42,4,0,58,49,41,4,0,40,154,1,59,1,49,255,3,0,58,49,41,4,0,40,168,0,40,154,1,60,1,49,44,4,0,58,49,41,4,0,40,168,0,40,154,1,40,154,1,49,42,4,0,1,1,253,3,21,3,4,2,42,0,0,0,0,1,35,1,20,40,168,0,216,0,2,20,40,168,0,216,0,2,39,49,2,4,0,1,0,39,49,2,4,0,1,1,39,49,2,4,0,1,2,58,20,40,168,0,192,0,2,20,40,168,0,192,0,2,39,49,2,4,0,1,0,39,49,2,4,0,1,1,39,49,2,4,0,1,2,40,168,0,1,0,21,6,4,2,42,0,0,0,0,1,35,44,1,39,49,4,4,0,1,0,79,39,49,4,4,0,1,2,40,14,3,6,40,154,1,3,18,0,0,0,0,1,1,49,5,4,0,59,1,39,49,4,4,0,1,1,58,39,49,4,4,0,1,0,40,168,0,40,168,0,60,1,39,49,4,4,0,1,2,58,39,49,4,4,0,1,0,40,168,0,40,168,0,49,5,4,0,6,40,154,1,1,18,0,0,0,0,1,0,21,9,4,2,42,1,0,46,45,4,9,201,7,40,168,0,2,1,0,201,7,0,0,3,48,40,168,0,1,47,45,4,0,20,40,168,0,3,4,1,49,8,4,0,23,0,1,39,49,7,4,0,1,0,81,39,49,7,4,0,1,1,40,14,3,2,42,0,0,0,0,1,23,0,1,39,49,7,4,0,1,1,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,0,1,2,75,20,40,154,1,6,4,2,39,49,7,4,0,3,0,1,2,49,45,4,0,40,154,1,1,23,0,1,39,49,7,4,0,1,0,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,0,2,1,75,20,40,154,1,6,4,2,39,49,7,4,0,3,0,2,1,49,45,4,0,40,154,1,1,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,2,0,1,75,20,40,154,1,6,4,2,39,49,7,4,0,3,2,0,1,49,45,4,0,40,154,1,1,1,23,0,1,39,49,7,4,0,1,0,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,1,0,2,75,20,40,154,1,6,4,2,39,49,7,4,0,3,1,0,2,49,45,4,0,40,154,1,1,23,0,1,39,49,7,4,0,1,1,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,1,2,0,75,20,40,154,1,6,4,2,39,49,7,4,0,3,1,2,0,49,45,4,0,40,154,1,1,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,2,1,0,75,20,40,154,1,6,4,2,39,49,7,4,0,3,2,1,0,49,45,4,0,40,154,1,1,35,49,7,4,0,1,2,3,4,6,4,21,12,4,2,42,3,0,46,46,4,9,125,7,40,168,0,2,46,47,4,9,26,9,40,154,1,2,46,48,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,48,40,168,0,1,47,46,4,0,1,39,49,11,4,0,1,3,59,39,49,10,4,0,1,3,40,168,0,48,40,154,1,1,47,47,4,0,1,39,49,10,4,0,3,0,1,2,59,39,49,11,4,0,1,3,40,154,1,48,40,154,1,1,47,48,4,0,1,39,49,11,4,0,3,0,1,2,59,39,49,10,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,20,40,154,1,9,4,2,49,47,4,0,49,48,4,0,49,46,4,0,49,48,4,0,57,39,49,11,4,0,3,0,1,2,40,154,1,58,49,48,4,0,40,154,1,57,39,49,10,4,0,3,0,1,2,40,154,1,58,49,47,4,0,40,154,1,1,1,39,49,10,4,0,1,3,57,39,49,11,4,0,1,3,40,168,0,58,49,46,4,0,40,168,0,1,2,1,4,9,4,21,15,4,2,42,3,0,46,49,4,9,125,7,40,168,0,2,46,50,4,9,26,9,40,154,1,2,46,51,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,48,40,168,0,1,47,49,4,0,1,39,49,14,4,0,1,3,59,39,49,13,4,0,1,3,40,168,0,48,40,154,1,1,47,50,4,0,1,39,49,13,4,0,3,0,1,2,59,39,49,14,4,0,1,3,40,154,1,48,40,154,1,1,47,51,4,0,1,39,49,14,4,0,3,0,1,2,59,39,49,13,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,20,40,154,1,9,4,2,49,51,4,0,49,50,4,0,49,49,4,0,49,51,4,0,57,39,49,14,4,0,3,0,1,2,40,154,1,58,49,51,4,0,40,154,1,57,39,49,13,4,0,3,0,1,2,40,154,1,58,49,50,4,0,40,154,1,1,1,39,49,13,4,0,1,3,57,39,49,14,4,0,1,3,40,168,0,58,49,49,4,0,40,168,0,1,2,1,4,9,4,21,18,4,2,42,3,0,46,52,4,9,125,7,40,168,0,2,46,53,4,9,26,9,40,154,1,2,46,54,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,48,40,168,0,1,47,52,4,0,1,39,49,17,4,0,1,3,59,39,49,16,4,0,1,3,40,168,0,48,40,154,1,1,47,53,4,0,1,39,49,16,4,0,3,0,1,2,59,39,49,17,4,0,1,3,40,154,1,48,40,154,1,1,47,54,4,0,1,39,49,17,4,0,3,0,1,2,59,39,49,16,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,49,53,4,0,49,52,4,0,49,54,4,0,57,39,49,17,4,0,3,0,1,2,40,154,1,58,49,54,4,0,40,154,1,57,39,49,16,4,0,3,0,1,2,40,154,1,58,49,53,4,0,40,154,1,1,1,39,49,16,4,0,1,3,57,39,49,17,4,0,1,3,40,168,0,58,49,52,4,0,40,168,0,1,1,1,4,21,21,4,2,42,3,0,46,55,4,9,125,7,40,168,0,2,46,56,4,9,26,9,40,154,1,2,46,57,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,48,40,168,0,1,47,55,4,0,1,39,49,20,4,0,1,3,59,39,49,19,4,0,1,3,40,168,0,48,40,154,1,1,47,56,4,0,1,39,49,19,4,0,3,0,1,2,59,39,49,20,4,0,1,3,40,154,1,48,40,154,1,1,47,57,4,0,1,39,49,20,4,0,3,0,1,2,59,39,49,19,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,49,57,4,0,49,55,4,0,49,56,4,0,57,39,49,20,4,0,3,0,1,2,40,154,1,58,49,57,4,0,40,154,1,57,39,49,19,4,0,3,0,1,2,40,154,1,58,49,56,4,0,40,154,1,1,1,39,49,19,4,0,1,3,57,39,49,20,4,0,1,3,40,168,0,58,49,55,4,0,40,168,0,1,1,1,4,13,2,0,42,29,0,46,58,4,29,8,1,34,9,40,1,0,0,46,59,4,29,8,1,41,9,40,1,0,0,46,60,4,29,8,1,46,9,40,1,0,0,46,61,4,29,8,1,51,9,40,1,0,0,46,62,4,29,8,1,60,9,40,1,0,0,46,63,4,29,8,1,69,9,40,1,0,0,46,64,4,29,8,1,76,9,40,1,0,0,46,65,4,29,8,1,83,9,40,1,0,0,46,66,4,29,8,1,91,9,40,1,0,0,46,67,4,29,8,1,99,9,40,1,0,0,46,68,4,29,8,1,108,9,40,1,0,0,46,69,4,29,8,1,117,9,40,1,0,0,46,70,4,29,8,1,122,9,40,1,0,0,46,71,4,29,8,1,128,9,40,1,0,0,46,72,4,29,8,1,138,9,40,1,0,0,46,73,4,29,8,1,146,9,40,1,0,0,46,74,4,29,8,1,155,9,40,1,0,0,46,75,4,29,8,1,163,9,40,1,0,0,46,76,4,29,8,1,172,9,40,1,0,0,46,77,4,29,8,1,184,9,40,1,0,0,46,78,4,29,8,1,195,9,40,1,0,0,46,79,4,29,8,1,206,9,40,1,0,0,46,80,4,29,8,1,217,9,40,1,0,0,46,81,4,29,8,1,229,9,40,1,0,0,46,82,4,29,8,1,240,9,40,1,0,0,46,83,4,29,8,1,250,9,40,1,0,0,46,84,4,29,8,1,255,9,40,1,0,0,46,85,4,29,8,1,11,10,40,1,0,0,46,86,4,29,8,1,18,10,40,1,0,0,29,0,34,9,0,0,11,10,27,0,184,9,19,0,172,9,18,0,155,9,16,0,217,9,22,0,46,9,2,0,108,9,10,0,76,9,6,0,91,9,8,0,60,9,4,0,229,9,23,0,195,9,20,0,250,9,25,0,163,9,17,0,18,10,28,0,128,9,13,0,240,9,24,0,146,9,15,0,122,9,12,0,255,9,26,0,138,9,14,0,206,9,21,0,41,9,1,0,99,9,9,0,69,9,5,0,83,9,7,0,51,9,3,0,117,9,11,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,21,25,4,2,42,0,0,0,0,2,38,0,42,0,0,0,0,49,22,4,0,29,27,0,0,0,0,1,35,20,40,248,1,164,3,2,49,23,4,0,49,24,4,0,27,1,0,0,0,1,35,20,40,248,1,167,3,2,49,23,4,0,49,24,4,0,27,2,0,0,0,1,35,20,40,248,1,170,3,2,49,23,4,0,49,24,4,0,27,3,0,0,0,1,35,20,40,248,1,173,3,2,49,23,4,0,49,24,4,0,27,4,0,0,0,1,35,20,40,248,1,176,3,2,49,23,4,0,49,24,4,0,27,5,0,0,0,1,35,20,40,248,1,179,3,2,49,23,4,0,49,24,4,0,27,6,0,0,0,1,35,20,40,248,1,182,3,2,49,23,4,0,49,24,4,0,27,7,0,0,0,1,35,20,40,248,1,185,3,2,49,23,4,0,49,24,4,0,27,8,0,0,0,1,35,20,40,248,1,188,3,2,49,23,4,0,49,24,4,0,27,9,0,0,0,1,35,20,40,248,1,191,3,2,49,23,4,0,49,24,4,0,27,10,0,0,0,1,35,20,40,248,1,194,3,2,49,23,4,0,49,24,4,0,27,11,0,0,0,1,35,20,40,248,1,197,3,2,49,23,4,0,49,24,4,0,27,12,0,0,0,1,35,20,40,248,1,200,3,2,49,23,4,0,49,24,4,0,27,13,0,0,0,1,35,20,40,248,1,203,3,2,49,23,4,0,49,24,4,0,27,14,0,0,0,1,35,20,40,248,1,206,3,2,49,23,4,0,49,24,4,0,27,15,0,0,0,1,35,20,40,248,1,212,3,2,49,23,4,0,49,24,4,0,27,16,0,0,0,1,35,20,40,248,1,215,3,2,49,23,4,0,49,24,4,0,27,17,0,0,0,1,35,20,40,248,1,218,3,2,49,23,4,0,49,24,4,0,27,18,0,0,0,1,35,20,40,248,1,227,3,2,49,23,4,0,49,24,4,0,27,19,0,0,0,1,35,20,40,248,1,233,3,2,49,23,4,0,49,24,4,0,27,20,0,0,0,1,35,20,40,248,1,236,3,2,49,23,4,0,49,24,4,0,27,21,0,0,0,1,35,20,40,248,1,242,3,2,49,23,4,0,49,24,4,0,27,22,0,0,0,1,35,20,40,248,1,245,3,2,49,23,4,0,49,24,4,0,27,23,0,0,0,1,35,20,40,248,1,248,3,2,49,23,4,0,49,24,4,0,27,24,0,0,0,1,35,20,40,248,1,251,3,2,49,23,4,0,49,24,4,0,27,25,0,0,0,1,35,20,40,248,1,12,4,2,49,23,4,0,49,24,4,0,27,26,0,0,0,1,35,20,40,248,1,15,4,2,49,23,4,0,49,24,4,0,27,27,0,0,0,1,35,20,40,248,1,18,4,2,49,23,4,0,49,24,4,0,27,28,0,0,0,1,35,20,40,248,1,21,4,2,49,23,4,0,49,24,4,0,35,6,40,248,1,1,18,0,0,0,0,1,29,164,3,167,3,170,3,173,3,176,3,179,3,182,3,185,3,188,3,191,3,194,3,197,3,200,3,203,3,206,3,212,3,215,3,218,3,227,3,233,3,236,3,242,3,245,3,248,3,251,3,12,4,15,4,18,4,21,4,21,27,4,2,42,0,0,0,0,1,35,6,40,248,1,2,1,39,49,26,4,0,3,0,1,2,60,20,40,168,0,216,0,2,39,49,26,4,0,1,3,18,23,183,209,56,40,154,1,39,49,26,4,0,1,3,1,0,21,29,4,2,42,0,0,0,0,1,35,6,40,114,1,2,1,39,49,28,4,0,3,0,1,2,60,20,40,160,0,208,0,2,39,49,28,4,0,1,3,18,23,183,209,56,40,150,1,39,49,28,4,0,1,3,1,0,21,31,4,2,42,0,0,0,0,1,35,1,39,49,30,4,0,2,0,1,60,39,49,30,4,0,1,2,40,108,1,1,0,};
+static constexpr size_t SKSL_INCLUDE_sksl_gpu_LENGTH = 23010;
+static uint8_t SKSL_INCLUDE_sksl_gpu[23010] = {28,10,11,83,107,66,108,101,110,100,77,111,100,101,7,100,101,103,114,101,101,115,8,36,103,101,110,84,121,112,101,7,114,97,100,105,97,110,115,5,97,110,103,108,101,3,115,105,110,3,99,111,115,3,116,97,110,1,120,4,97,115,105,110,4,97,99,111,115,1,121,4,97,116,97,110,8,121,95,111,118,101,114,95,120,4,115,105,110,104,4,99,111,115,104,4,116,97,110,104,5,97,115,105,110,104,5,97,99,111,115,104,5,97,116,97,110,104,3,112,111,119,3,101,120,112,3,108,111,103,4,101,120,112,50,4,108,111,103,50,4,115,113,114,116,9,36,103,101,110,72,84,121,112,101,11,105,110,118,101,114,115,101,115,113,114,116,3,97,98,115,9,36,103,101,110,73,84,121,112,101,4,115,105,103,110,5,102,108,111,111,114,5,116,114,117,110,99,5,114,111,117,110,100,9,114,111,117,110,100,69,118,101,110,4,99,101,105,108,5,102,114,97,99,116,5,102,108,111,97,116,3,109,111,100,4,104,97,108,102,1,105,4,109,111,100,102,3,109,105,110,3,105,110,116,3,109,97,120,6,109,105,110,86,97,108,6,109,97,120,86,97,108,5,99,108,97,109,112,8,115,97,116,117,114,97,116,101,1,97,3,109,105,120,9,36,103,101,110,66,84,121,112,101,4,101,100,103,101,4,115,116,101,112,5,101,100,103,101,48,5,101,100,103,101,49,10,115,109,111,111,116,104,115,116,101,112,5,105,115,110,97,110,5,105,115,105,110,102,5,118,97,108,117,101,14,102,108,111,97,116,66,105,116,115,84,111,73,110,116,14,105,110,116,66,105,116,115,84,111,102,108,111,97,116,9,36,103,101,110,85,84,121,112,101,15,117,105,110,116,66,105,116,115,84,111,102,108,111,97,116,1,98,1,99,3,102,109,97,5,102,114,101,120,112,5,108,100,101,120,112,1,118,6,102,108,111,97,116,50,13,112,97,99,107,85,110,111,114,109,50,120,49,54,4,117,105,110,116,13,112,97,99,107,83,110,111,114,109,50,120,49,54,6,102,108,111,97,116,52,12,112,97,99,107,85,110,111,114,109,52,120,56,12,112,97,99,107,83,110,111,114,109,52,120,56,1,112,15,117,110,112,97,99,107,85,110,111,114,109,50,120,49,54,15,117,110,112,97,99,107,83,110,111,114,109,50,120,49,54,14,117,110,112,97,99,107,85,110,111,114,109,52,120,56,14,117,110,112,97,99,107,83,110,111,114,109,52,120,56,12,112,97,99,107,72,97,108,102,50,120,49,54,14,117,110,112,97,99,107,72,97,108,102,50,120,49,54,6,108,101,110,103,116,104,2,112,48,2,112,49,8,100,105,115,116,97,110,99,101,3,100,111,116,6,102,108,111,97,116,51,5,99,114,111,115,115,5,104,97,108,102,51,9,110,111,114,109,97,108,105,122,101,10,102,116,114,97,110,115,102,111,114,109,1,78,1,73,4,78,114,101,102,11,102,97,99,101,102,111,114,119,97,114,100,7,114,101,102,108,101,99,116,3,101,116,97,7,114,101,102,114,97,99,116,4,36,109,97,116,14,109,97,116,114,105,120,67,111,109,112,77,117,108,116,1,114,12,111,117,116,101,114,80,114,111,100,117,99,116,8,102,108,111,97,116,50,120,50,8,102,108,111,97,116,51,120,51,8,102,108,111,97,116,52,120,51,8,102,108,111,97,116,50,120,51,8,102,108,111,97,116,51,120,50,8,102,108,111,97,116,50,120,52,8,102,108,111,97,116,52,120,50,8,102,108,111,97,116,51,120,52,5,104,97,108,102,50,7,104,97,108,102,50,120,50,7,104,97,108,102,51,120,51,5,104,97,108,102,52,7,104,97,108,102,52,120,51,7,104,97,108,102,50,120,51,7,104,97,108,102,51,120,50,7,104,97,108,102,50,120,52,7,104,97,108,102,52,120,50,7,104,97,108,102,51,120,52,1,109,9,116,114,97,110,115,112,111,115,101,8,102,108,111,97,116,52,120,52,7,104,97,108,102,52,120,52,11,100,101,116,101,114,109,105,110,97,110,116,7,105,110,118,101,114,115,101,4,36,118,101,99,8,108,101,115,115,84,104,97,110,5,36,98,118,101,99,5,36,104,118,101,99,5,36,105,118,101,99,5,36,115,118,101,99,6,36,117,115,118,101,99,5,36,117,118,101,99,13,108,101,115,115,84,104,97,110,69,113,117,97,108,11,103,114,101,97,116,101,114,84,104,97,110,16,103,114,101,97,116,101,114,84,104,97,110,69,113,117,97,108,5,101,113,117,97,108,8,110,111,116,69,113,117,97,108,3,97,110,121,4,98,111,111,108,3,97,108,108,3,110,111,116,8,98,105,116,67,111,117,110,116,7,102,105,110,100,76,83,66,7,102,105,110,100,77,83,66,7,116,101,120,116,117,114,101,9,116,101,120,116,117,114,101,50,68,7,115,97,109,112,108,101,114,13,109,97,107,101,83,97,109,112,108,101,114,50,68,9,115,97,109,112,108,101,114,50,68,15,36,103,115,97,109,112,108,101,114,50,68,82,101,99,116,11,116,101,120,116,117,114,101,83,105,122,101,4,105,110,116,50,11,36,103,115,97,109,112,108,101,114,49,68,1,80,6,115,97,109,112,108,101,4,98,105,97,115,11,36,103,115,97,109,112,108,101,114,50,68,10,105,115,97,109,112,108,101,114,50,68,4,105,110,116,52,18,115,97,109,112,108,101,114,69,120,116,101,114,110,97,108,79,69,83,7,115,117,98,112,97,115,115,12,115,117,98,112,97,115,115,73,110,112,117,116,11,115,117,98,112,97,115,115,76,111,97,100,14,115,117,98,112,97,115,115,73,110,112,117,116,77,83,5,105,109,97,103,101,7,105,109,97,103,101,50,68,9,105,109,97,103,101,76,111,97,100,8,105,105,109,97,103,101,50,68,4,100,70,100,120,4,100,70,100,121,6,102,119,105,100,116,104,11,105,110,116,101,114,112,111,108,97,110,116,19,105,110,116,101,114,112,111,108,97,116,101,65,116,83,97,109,112,108,101,6,111,102,102,115,101,116,19,105,110,116,101,114,112,111,108,97,116,101,65,116,79,102,102,115,101,116,3,115,114,99,3,100,115,116,11,98,108,101,110,100,95,99,108,101,97,114,9,98,108,101,110,100,95,115,114,99,9,98,108,101,110,100,95,100,115,116,14,98,108,101,110,100,95,115,114,99,95,111,118,101,114,14,98,108,101,110,100,95,100,115,116,95,111,118,101,114,12,98,108,101,110,100,95,115,114,99,95,105,110,12,98,108,101,110,100,95,100,115,116,95,105,110,13,98,108,101,110,100,95,115,114,99,95,111,117,116,13,98,108,101,110,100,95,100,115,116,95,111,117,116,14,98,108,101,110,100,95,115,114,99,95,97,116,111,112,14,98,108,101,110,100,95,100,115,116,95,97,116,111,112,9,98,108,101,110,100,95,120,111,114,10,98,108,101,110,100,95,112,108,117,115,14,98,108,101,110,100,95,109,111,100,117,108,97,116,101,12,98,108,101,110,100,95,115,99,114,101,101,110,1,115,1,100,24,95,98,108,101,110,100,95,111,118,101,114,108,97,121,95,99,111,109,112,111,110,101,110,116,13,98,108,101,110,100,95,111,118,101,114,108,97,121,12,98,108,101,110,100,95,100,97,114,107,101,110,13,98,108,101,110,100,95,108,105,103,104,116,101,110,1,110,15,95,103,117,97,114,100,101,100,95,100,105,118,105,100,101,22,95,99,111,108,111,114,95,100,111,100,103,101,95,99,111,109,112,111,110,101,110,116,17,98,108,101,110,100,95,99,111,108,111,114,95,100,111,100,103,101,21,95,99,111,108,111,114,95,98,117,114,110,95,99,111,109,112,111,110,101,110,116,16,98,108,101,110,100,95,99,111,108,111,114,95,98,117,114,110,16,98,108,101,110,100,95,104,97,114,100,95,108,105,103,104,116,21,95,115,111,102,116,95,108,105,103,104,116,95,99,111,109,112,111,110,101,110,116,16,98,108,101,110,100,95,115,111,102,116,95,108,105,103,104,116,16,98,108,101,110,100,95,100,105,102,102,101,114,101,110,99,101,15,98,108,101,110,100,95,101,120,99,108,117,115,105,111,110,14,98,108,101,110,100,95,109,117,108,116,105,112,108,121,5,99,111,108,111,114,22,95,98,108,101,110,100,95,99,111,108,111,114,95,108,117,109,105,110,97,110,99,101,11,104,117,101,83,97,116,67,111,108,111,114,5,97,108,112,104,97,8,108,117,109,67,111,108,111,114,26,95,98,108,101,110,100,95,115,101,116,95,99,111,108,111,114,95,108,117,109,105,110,97,110,99,101,23,95,98,108,101,110,100,95,99,111,108,111,114,95,115,97,116,117,114,97,116,105,111,110,9,109,105,110,77,105,100,77,97,120,3,115,97,116,34,95,98,108,101,110,100,95,115,101,116,95,99,111,108,111,114,95,115,97,116,117,114,97,116,105,111,110,95,104,101,108,112,101,114,11,104,117,101,76,117,109,67,111,108,111,114,8,115,97,116,67,111,108,111,114,27,95,98,108,101,110,100,95,115,101,116,95,99,111,108,111,114,95,115,97,116,117,114,97,116,105,111,110,9,98,108,101,110,100,95,104,117,101,16,98,108,101,110,100,95,115,97,116,117,114,97,116,105,111,110,11,98,108,101,110,100,95,99,111,108,111,114,16,98,108,101,110,100,95,108,117,109,105,110,111,115,105,116,121,4,109,111,100,101,5,98,108,101,110,100,8,117,110,112,114,101,109,117,108,14,117,110,112,114,101,109,117,108,95,102,108,111,97,116,4,112,114,111,106,45,115,107,95,67,97,112,115,46,105,110,66,108,101,110,100,77,111,100,101,115,70,97,105,108,82,97,110,100,111,109,108,121,70,111,114,65,108,108,90,101,114,111,86,101,99,6,114,101,115,117,108,116,51,115,107,95,67,97,112,115,46,109,117,115,116,71,117,97,114,100,68,105,118,105,115,105,111,110,69,118,101,110,65,102,116,101,114,69,120,112,108,105,99,105,116,90,101,114,111,67,104,101,99,107,5,100,101,108,116,97,4,68,83,113,100,4,68,67,117,98,5,68,97,83,113,100,5,68,97,67,117,98,3,108,117,109,7,109,105,110,67,111,109,112,7,109,97,120,67,111,109,112,3,115,100,97,3,100,115,97,6,107,67,108,101,97,114,4,107,83,114,99,4,107,68,115,116,8,107,83,114,99,79,118,101,114,8,107,68,115,116,79,118,101,114,6,107,83,114,99,73,110,6,107,68,115,116,73,110,7,107,83,114,99,79,117,116,7,107,68,115,116,79,117,116,8,107,83,114,99,65,84,111,112,8,107,68,115,116,65,84,111,112,4,107,88,111,114,5,107,80,108,117,115,9,107,77,111,100,117,108,97,116,101,7,107,83,99,114,101,101,110,8,107,79,118,101,114,108,97,121,7,107,68,97,114,107,101,110,8,107,76,105,103,104,116,101,110,11,107,67,111,108,111,114,68,111,100,103,101,10,107,67,111,108,111,114,66,117,114,110,10,107,72,97,114,100,76,105,103,104,116,10,107,83,111,102,116,76,105,103,104,116,11,107,68,105,102,102,101,114,101,110,99,101,10,107,69,120,99,108,117,115,105,111,110,9,107,77,117,108,116,105,112,108,121,4,107,72,117,101,11,107,83,97,116,117,114,97,116,105,111,110,6,107,67,111,108,111,114,11,107,76,117,109,105,110,111,115,105,116,121,42,231,3,14,1,0,2,0,46,2,0,9,14,0,43,3,0,22,0,3,22,4,0,9,31,0,1,2,0,40,3,0,46,5,0,9,39,0,40,3,0,3,22,6,0,9,45,0,1,5,0,40,3,0,46,7,0,9,39,0,40,3,0,3,22,8,0,9,49,0,1,7,0,40,3,0,46,9,0,9,39,0,40,3,0,3,22,10,0,9,53,0,1,9,0,40,3,0,46,11,0,9,57,0,40,3,0,3,22,12,0,9,59,0,1,11,0,40,3,0,46,13,0,9,57,0,40,3,0,3,22,14,0,9,64,0,1,13,0,40,3,0,46,15,0,9,69,0,40,3,0,3,46,16,0,9,57,0,40,3,0,3,22,17,0,9,71,0,2,15,0,16,0,40,3,0,46,18,0,9,76,0,40,3,0,3,45,19,0,2,40,17,0,22,20,0,9,71,0,1,18,0,40,3,0,40,20,0,46,21,0,9,57,0,40,3,0,3,22,22,0,9,85,0,1,21,0,40,3,0,46,23,0,9,57,0,40,3,0,3,22,24,0,9,90,0,1,23,0,40,3,0,46,25,0,9,57,0,40,3,0,3,22,26,0,9,95,0,1,25,0,40,3,0,46,27,0,9,57,0,40,3,0,3,22,28,0,9,100,0,1,27,0,40,3,0,46,29,0,9,57,0,40,3,0,3,22,30,0,9,106,0,1,29,0,40,3,0,46,31,0,9,57,0,40,3,0,3,22,32,0,9,112,0,1,31,0,40,3,0,46,33,0,9,57,0,40,3,0,3,46,34,0,9,69,0,40,3,0,3,22,35,0,9,118,0,2,33,0,34,0,40,3,0,46,36,0,9,57,0,40,3,0,3,22,37,0,9,122,0,1,36,0,40,3,0,46,38,0,9,57,0,40,3,0,3,22,39,0,9,126,0,1,38,0,40,3,0,46,40,0,9,57,0,40,3,0,3,22,41,0,9,130,0,1,40,0,40,3,0,46,42,0,9,57,0,40,3,0,3,22,43,0,9,135,0,1,42,0,40,3,0,46,44,0,9,57,0,40,3,0,3,22,45,0,9,140,0,1,44,0,40,3,0,46,46,0,9,14,0,43,47,0,145,0,3,45,48,0,2,40,4,0,22,49,0,9,31,0,1,46,0,40,47,0,40,49,0,46,50,0,9,39,0,40,47,0,3,45,51,0,2,40,6,0,22,52,0,9,45,0,1,50,0,40,47,0,40,52,0,46,53,0,9,39,0,40,47,0,3,45,54,0,2,40,8,0,22,55,0,9,49,0,1,53,0,40,47,0,40,55,0,46,56,0,9,39,0,40,47,0,3,45,57,0,2,40,10,0,22,58,0,9,53,0,1,56,0,40,47,0,40,58,0,46,59,0,9,57,0,40,47,0,3,45,60,0,2,40,12,0,22,61,0,9,59,0,1,59,0,40,47,0,40,61,0,46,62,0,9,57,0,40,47,0,3,45,63,0,2,40,14,0,22,64,0,9,64,0,1,62,0,40,47,0,40,64,0,46,65,0,9,69,0,40,47,0,3,46,66,0,9,57,0,40,47,0,3,45,67,0,3,40,17,0,40,20,0,22,68,0,9,71,0,2,65,0,66,0,40,47,0,40,68,0,46,69,0,9,76,0,40,47,0,3,45,70,0,4,40,17,0,40,20,0,40,68,0,22,71,0,9,71,0,1,69,0,40,47,0,40,71,0,46,72,0,9,57,0,40,47,0,3,45,73,0,2,40,22,0,22,74,0,9,85,0,1,72,0,40,47,0,40,74,0,46,75,0,9,57,0,40,47,0,3,45,76,0,2,40,24,0,22,77,0,9,90,0,1,75,0,40,47,0,40,77,0,46,78,0,9,57,0,40,47,0,3,45,79,0,2,40,26,0,22,80,0,9,95,0,1,78,0,40,47,0,40,80,0,46,81,0,9,57,0,40,47,0,3,45,82,0,2,40,28,0,22,83,0,9,100,0,1,81,0,40,47,0,40,83,0,46,84,0,9,57,0,40,47,0,3,45,85,0,2,40,30,0,22,86,0,9,106,0,1,84,0,40,47,0,40,86,0,46,87,0,9,57,0,40,47,0,3,45,88,0,2,40,32,0,22,89,0,9,112,0,1,87,0,40,47,0,40,89,0,46,90,0,9,57,0,40,47,0,3,46,91,0,9,69,0,40,47,0,3,45,92,0,2,40,35,0,22,93,0,9,118,0,2,90,0,91,0,40,47,0,40,93,0,46,94,0,9,57,0,40,47,0,3,45,95,0,2,40,37,0,22,96,0,9,122,0,1,94,0,40,47,0,40,96,0,46,97,0,9,57,0,40,47,0,3,45,98,0,2,40,39,0,22,99,0,9,126,0,1,97,0,40,47,0,40,99,0,46,100,0,9,57,0,40,47,0,3,45,101,0,2,40,41,0,22,102,0,9,130,0,1,100,0,40,47,0,40,102,0,46,103,0,9,57,0,40,47,0,3,45,104,0,2,40,43,0,22,105,0,9,135,0,1,103,0,40,47,0,40,105,0,46,106,0,9,57,0,40,47,0,3,45,107,0,2,40,45,0,22,108,0,9,140,0,1,106,0,40,47,0,40,108,0,46,109,0,9,57,0,40,3,0,3,22,110,0,9,155,0,1,109,0,40,3,0,46,111,0,9,57,0,40,3,0,3,22,112,0,9,167,0,1,111,0,40,3,0,46,113,0,9,57,0,40,47,0,3,45,114,0,2,40,112,0,22,115,0,9,167,0,1,113,0,40,47,0,40,115,0,46,116,0,9,57,0,43,117,0,171,0,3,45,118,0,3,40,112,0,40,115,0,22,119,0,9,167,0,1,116,0,40,117,0,40,119,0,46,120,0,9,57,0,40,3,0,3,22,121,0,9,181,0,1,120,0,40,3,0,46,122,0,9,57,0,40,47,0,3,45,123,0,2,40,121,0,22,124,0,9,181,0,1,122,0,40,47,0,40,124,0,46,125,0,9,57,0,40,117,0,3,45,126,0,3,40,121,0,40,124,0,22,127,0,9,181,0,1,125,0,40,117,0,40,127,0,46,128,0,9,57,0,40,3,0,3,22,129,0,9,186,0,1,128,0,40,3,0,46,130,0,9,57,0,40,47,0,3,45,131,0,2,40,129,0,22,132,0,9,186,0,1,130,0,40,47,0,40,132,0,46,133,0,9,57,0,40,3,0,3,22,134,0,9,192,0,1,133,0,40,3,0,46,135,0,9,57,0,40,47,0,3,45,136,0,2,40,134,0,22,137,0,9,192,0,1,135,0,40,47,0,40,137,0,46,138,0,9,57,0,40,3,0,3,22,139,0,9,198,0,1,138,0,40,3,0,46,140,0,9,57,0,40,47,0,3,45,141,0,2,40,139,0,22,142,0,9,198,0,1,140,0,40,47,0,40,142,0,46,143,0,9,57,0,40,3,0,3,22,144,0,9,204,0,1,143,0,40,3,0,46,145,0,9,57,0,40,47,0,3,45,146,0,2,40,144,0,22,147,0,9,204,0,1,145,0,40,47,0,40,147,0,46,148,0,9,57,0,40,3,0,3,22,149,0,9,214,0,1,148,0,40,3,0,46,150,0,9,57,0,40,47,0,3,45,151,0,2,40,149,0,22,152,0,9,214,0,1,150,0,40,47,0,40,152,0,46,153,0,9,57,0,40,3,0,3,22,154,0,9,219,0,1,153,0,40,3,0,46,155,0,9,57,0,40,47,0,3,45,156,0,2,40,154,0,22,157,0,9,219,0,1,155,0,40,47,0,40,157,0,46,158,0,9,57,0,40,3,0,3,46,159,0,9,69,0,43,160,0,225,0,3,22,161,0,9,231,0,2,158,0,159,0,40,3,0,46,162,0,9,57,0,40,3,0,3,46,163,0,9,69,0,40,3,0,3,45,164,0,2,40,161,0,22,165,0,9,231,0,2,162,0,163,0,40,3,0,40,165,0,46,166,0,9,57,0,40,47,0,3,46,167,0,9,69,0,43,168,0,235,0,3,45,169,0,3,40,161,0,40,165,0,22,170,0,9,231,0,2,166,0,167,0,40,47,0,40,170,0,46,171,0,9,57,0,40,47,0,3,46,172,0,9,69,0,40,47,0,3,45,173,0,4,40,161,0,40,165,0,40,170,0,22,174,0,9,231,0,2,171,0,172,0,40,47,0,40,174,0,46,175,0,9,57,0,40,3,0,3,46,176,0,29,8,4,240,0,40,3,0,3,22,177,0,9,242,0,2,175,0,176,0,40,3,0,46,178,0,9,57,0,40,47,0,3,46,179,0,29,8,4,240,0,40,47,0,3,45,180,0,2,40,177,0,22,181,0,9,242,0,2,178,0,179,0,40,47,0,40,181,0,46,182,0,9,57,0,40,3,0,3,46,183,0,9,69,0,40,3,0,3,22,184,0,9,247,0,2,182,0,183,0,40,3,0,46,185,0,9,57,0,40,3,0,3,46,186,0,9,69,0,40,160,0,3,45,187,0,2,40,184,0,22,188,0,9,247,0,2,185,0,186,0,40,3,0,40,188,0,46,189,0,9,57,0,40,47,0,3,46,190,0,9,69,0,40,47,0,3,45,191,0,3,40,184,0,40,188,0,22,192,0,9,247,0,2,189,0,190,0,40,47,0,40,192,0,46,193,0,9,57,0,40,47,0,3,46,194,0,9,69,0,40,168,0,3,45,195,0,4,40,184,0,40,188,0,40,192,0,22,196,0,9,247,0,2,193,0,194,0,40,47,0,40,196,0,46,197,0,9,57,0,40,117,0,3,46,198,0,9,69,0,40,117,0,3,45,199,0,5,40,184,0,40,188,0,40,192,0,40,196,0,22,200,0,9,247,0,2,197,0,198,0,40,117,0,40,200,0,46,201,0,9,57,0,40,117,0,3,46,202,0,9,69,0,43,203,0,251,0,3,45,204,0,6,40,184,0,40,188,0,40,192,0,40,196,0,40,200,0,22,205,0,9,247,0,2,201,0,202,0,40,117,0,40,205,0,46,206,0,9,57,0,40,3,0,3,46,207,0,9,69,0,40,3,0,3,22,208,0,9,255,0,2,206,0,207,0,40,3,0,46,209,0,9,57,0,40,3,0,3,46,210,0,9,69,0,40,160,0,3,45,211,0,2,40,208,0,22,212,0,9,255,0,2,209,0,210,0,40,3,0,40,212,0,46,213,0,9,57,0,40,47,0,3,46,214,0,9,69,0,40,47,0,3,45,215,0,3,40,208,0,40,212,0,22,216,0,9,255,0,2,213,0,214,0,40,47,0,40,216,0,46,217,0,9,57,0,40,47,0,3,46,218,0,9,69,0,40,168,0,3,45,219,0,4,40,208,0,40,212,0,40,216,0,22,220,0,9,255,0,2,217,0,218,0,40,47,0,40,220,0,46,221,0,9,57,0,40,117,0,3,46,222,0,9,69,0,40,117,0,3,45,223,0,5,40,208,0,40,212,0,40,216,0,40,220,0,22,224,0,9,255,0,2,221,0,222,0,40,117,0,40,224,0,46,225,0,9,57,0,40,117,0,3,46,226,0,9,69,0,40,203,0,3,45,227,0,6,40,208,0,40,212,0,40,216,0,40,220,0,40,224,0,22,228,0,9,255,0,2,225,0,226,0,40,117,0,40,228,0,46,229,0,9,57,0,40,3,0,3,46,230,0,9,3,1,40,3,0,3,46,231,0,9,10,1,40,3,0,3,22,232,0,9,17,1,3,229,0,230,0,231,0,40,3,0,46,233,0,9,57,0,40,3,0,3,46,234,0,9,3,1,40,160,0,3,46,235,0,9,10,1,40,160,0,3,45,236,0,2,40,232,0,22,237,0,9,17,1,3,233,0,234,0,235,0,40,3,0,40,237,0,46,238,0,9,57,0,40,47,0,3,46,239,0,9,3,1,40,47,0,3,46,240,0,9,10,1,40,47,0,3,45,241,0,3,40,232,0,40,237,0,22,242,0,9,17,1,3,238,0,239,0,240,0,40,47,0,40,242,0,46,243,0,9,57,0,40,47,0,3,46,244,0,9,3,1,40,168,0,3,46,245,0,9,10,1,40,168,0,3,45,246,0,4,40,232,0,40,237,0,40,242,0,22,247,0,9,17,1,3,243,0,244,0,245,0,40,47,0,40,247,0,46,248,0,9,57,0,40,117,0,3,46,249,0,9,3,1,40,117,0,3,46,250,0,9,10,1,40,117,0,3,45,251,0,5,40,232,0,40,237,0,40,242,0,40,247,0,22,252,0,9,17,1,3,248,0,249,0,250,0,40,117,0,40,252,0,46,253,0,9,57,0,40,117,0,3,46,254,0,9,3,1,40,203,0,3,46,255,0,9,10,1,40,203,0,3,45,0,1,6,40,232,0,40,237,0,40,242,0,40,247,0,40,252,0,22,1,1,9,17,1,3,253,0,254,0,255,0,40,117,0,40,1,1,46,2,1,9,57,0,40,3,0,3,22,3,1,9,23,1,1,2,1,40,3,0,46,4,1,9,57,0,40,47,0,3,45,5,1,2,40,3,1,22,6,1,9,23,1,1,4,1,40,47,0,40,6,1,46,7,1,9,57,0,40,3,0,3,46,8,1,9,69,0,40,3,0,3,46,9,1,9,32,1,40,3,0,3,22,10,1,9,34,1,3,7,1,8,1,9,1,40,3,0,46,11,1,9,57,0,40,3,0,3,46,12,1,9,69,0,40,3,0,3,46,13,1,9,32,1,40,160,0,3,45,14,1,2,40,10,1,22,15,1,9,34,1,3,11,1,12,1,13,1,40,3,0,40,15,1,46,16,1,9,57,0,40,47,0,3,46,17,1,9,69,0,40,47,0,3,46,18,1,9,32,1,40,47,0,3,45,19,1,3,40,10,1,40,15,1,22,20,1,9,34,1,3,16,1,17,1,18,1,40,47,0,40,20,1,46,21,1,9,57,0,40,47,0,3,46,22,1,9,69,0,40,47,0,3,46,23,1,9,32,1,40,168,0,3,45,24,1,4,40,10,1,40,15,1,40,20,1,22,25,1,9,34,1,3,21,1,22,1,23,1,40,47,0,40,25,1,46,26,1,9,57,0,40,3,0,3,46,27,1,9,69,0,40,3,0,3,46,28,1,9,32,1,43,29,1,38,1,3,45,30,1,5,40,10,1,40,15,1,40,20,1,40,25,1,22,31,1,9,34,1,3,26,1,27,1,28,1,40,3,0,40,31,1,46,32,1,9,57,0,40,47,0,3,46,33,1,9,69,0,40,47,0,3,46,34,1,9,32,1,40,29,1,3,45,35,1,6,40,10,1,40,15,1,40,20,1,40,25,1,40,31,1,22,36,1,9,34,1,3,32,1,33,1,34,1,40,47,0,40,36,1,46,37,1,9,57,0,40,117,0,3,46,38,1,9,69,0,40,117,0,3,46,39,1,9,32,1,40,29,1,3,45,40,1,7,40,10,1,40,15,1,40,20,1,40,25,1,40,31,1,40,36,1,22,41,1,9,34,1,3,37,1,38,1,39,1,40,117,0,40,41,1,46,42,1,9,57,0,40,29,1,3,46,43,1,9,69,0,40,29,1,3,46,44,1,9,32,1,40,29,1,3,45,45,1,8,40,10,1,40,15,1,40,20,1,40,25,1,40,31,1,40,36,1,40,41,1,22,46,1,9,34,1,3,42,1,43,1,44,1,40,29,1,40,46,1,46,47,1,9,48,1,40,3,0,3,46,48,1,9,57,0,40,3,0,3,22,49,1,9,53,1,2,47,1,48,1,40,3,0,46,50,1,9,48,1,40,160,0,3,46,51,1,9,57,0,40,3,0,3,45,52,1,2,40,49,1,22,53,1,9,53,1,2,50,1,51,1,40,3,0,40,53,1,46,54,1,9,48,1,40,47,0,3,46,55,1,9,57,0,40,47,0,3,45,56,1,3,40,49,1,40,53,1,22,57,1,9,53,1,2,54,1,55,1,40,47,0,40,57,1,46,58,1,9,48,1,40,168,0,3,46,59,1,9,57,0,40,47,0,3,45,60,1,4,40,49,1,40,53,1,40,57,1,22,61,1,9,53,1,2,58,1,59,1,40,47,0,40,61,1,46,62,1,9,58,1,40,3,0,3,46,63,1,9,64,1,40,3,0,3,46,64,1,9,57,0,40,3,0,3,22,65,1,9,70,1,3,62,1,63,1,64,1,40,3,0,46,66,1,9,58,1,40,160,0,3,46,67,1,9,64,1,40,160,0,3,46,68,1,9,57,0,40,3,0,3,45,69,1,2,40,65,1,22,70,1,9,70,1,3,66,1,67,1,68,1,40,3,0,40,70,1,46,71,1,9,58,1,40,47,0,3,46,72,1,9,64,1,40,47,0,3,46,73,1,9,57,0,40,47,0,3,45,74,1,3,40,65,1,40,70,1,22,75,1,9,70,1,3,71,1,72,1,73,1,40,47,0,40,75,1,46,76,1,9,58,1,40,168,0,3,46,77,1,9,64,1,40,168,0,3,46,78,1,9,57,0,40,47,0,3,45,79,1,4,40,65,1,40,70,1,40,75,1,22,80,1,9,70,1,3,76,1,77,1,78,1,40,47,0,40,80,1,46,81,1,9,57,0,40,3,0,3,22,82,1,9,81,1,1,81,1,40,29,1,46,83,1,9,57,0,40,3,0,3,22,84,1,9,87,1,1,83,1,40,29,1,46,85,1,9,93,1,40,3,0,3,22,86,1,9,99,1,1,85,1,40,117,0,46,87,1,9,93,1,40,117,0,3,22,88,1,9,114,1,1,87,1,40,3,0,46,89,1,9,93,1,43,90,1,129,1,3,22,91,1,9,139,1,1,89,1,40,3,0,46,92,1,9,32,1,40,3,0,3,46,93,1,9,155,1,40,3,0,3,46,94,1,9,157,1,40,3,0,3,22,95,1,9,159,1,3,92,1,93,1,94,1,40,3,0,46,96,1,9,32,1,40,47,0,3,46,97,1,9,155,1,40,47,0,3,46,98,1,9,157,1,40,47,0,3,45,99,1,2,40,95,1,22,100,1,9,159,1,3,96,1,97,1,98,1,40,47,0,40,100,1,46,101,1,9,57,0,40,3,0,3,46,102,1,29,8,4,122,0,40,117,0,3,22,103,1,30,8,0,16,0,0,163,1,2,101,1,102,1,40,3,0,46,104,1,9,57,0,40,3,0,3,46,105,1,29,8,2,122,0,40,117,0,3,22,106,1,9,169,1,2,104,1,105,1,40,3,0,46,107,1,9,175,1,43,108,1,177,1,3,22,109,1,9,184,1,1,107,1,43,110,1,198,1,46,111,1,9,175,1,40,108,1,3,22,112,1,9,203,1,1,111,1,40,110,1,46,113,1,9,175,1,43,114,1,217,1,3,22,115,1,9,224,1,1,113,1,40,110,1,46,116,1,9,175,1,40,114,1,3,22,117,1,9,237,1,1,116,1,40,110,1,46,118,1,9,250,1,40,110,1,3,22,119,1,9,252,1,1,118,1,40,108,1,46,120,1,9,250,1,40,110,1,3,22,121,1,9,12,2,1,120,1,40,108,1,46,122,1,9,250,1,40,110,1,3,22,123,1,9,28,2,1,122,1,40,114,1,46,124,1,9,250,1,40,110,1,3,22,125,1,9,43,2,1,124,1,40,114,1,46,126,1,9,175,1,40,108,1,3,22,127,1,9,58,2,1,126,1,40,110,1,46,128,1,9,175,1,40,110,1,3,22,129,1,9,71,2,1,128,1,40,108,1,46,130,1,9,57,0,40,3,0,3,22,131,1,9,86,2,1,130,1,40,160,0,46,132,1,9,57,0,40,47,0,3,45,133,1,2,40,131,1,22,134,1,9,86,2,1,132,1,40,168,0,40,134,1,46,135,1,9,93,2,40,3,0,3,46,136,1,9,96,2,40,3,0,3,22,137,1,9,99,2,2,135,1,136,1,40,160,0,46,138,1,9,93,2,40,47,0,3,46,139,1,9,96,2,40,47,0,3,45,140,1,2,40,137,1,22,141,1,9,99,2,2,138,1,139,1,40,168,0,40,141,1,46,142,1,9,57,0,40,3,0,3,46,143,1,9,69,0,40,3,0,3,22,144,1,9,108,2,2,142,1,143,1,40,160,0,46,145,1,9,57,0,40,47,0,3,46,146,1,9,69,0,40,47,0,3,45,147,1,2,40,144,1,22,148,1,9,108,2,2,145,1,146,1,40,168,0,40,148,1,46,149,1,9,57,0,43,150,1,112,2,3,46,151,1,9,69,0,40,150,1,3,22,152,1,9,119,2,2,149,1,151,1,40,150,1,46,153,1,9,57,0,43,154,1,125,2,3,46,155,1,9,69,0,40,154,1,3,45,156,1,2,40,152,1,22,157,1,9,119,2,2,153,1,155,1,40,154,1,40,157,1,46,158,1,9,57,0,40,3,0,3,22,159,1,9,131,2,1,158,1,40,3,0,46,160,1,9,57,0,40,47,0,3,45,161,1,2,40,159,1,22,162,1,9,131,2,1,160,1,40,47,0,40,162,1,22,163,1,9,141,2,0,40,114,1,46,164,1,9,152,2,40,3,0,3,46,165,1,9,154,2,40,3,0,3,46,166,1,9,156,2,40,3,0,3,22,167,1,9,161,2,3,164,1,165,1,166,1,40,3,0,46,168,1,9,152,2,40,47,0,3,46,169,1,9,154,2,40,47,0,3,46,170,1,9,156,2,40,47,0,3,45,171,1,2,40,167,1,22,172,1,9,161,2,3,168,1,169,1,170,1,40,47,0,40,172,1,46,173,1,9,154,2,40,3,0,3,46,174,1,9,152,2,40,3,0,3,22,175,1,9,173,2,2,173,1,174,1,40,3,0,46,176,1,9,154,2,40,47,0,3,46,177,1,9,152,2,40,47,0,3,45,178,1,2,40,175,1,22,179,1,9,173,2,2,176,1,177,1,40,47,0,40,179,1,46,180,1,9,154,2,40,3,0,3,46,181,1,9,152,2,40,3,0,3,46,182,1,9,181,2,40,160,0,3,22,183,1,9,185,2,3,180,1,181,1,182,1,40,3,0,46,184,1,9,154,2,40,47,0,3,46,185,1,9,152,2,40,47,0,3,46,186,1,9,181,2,40,160,0,3,45,187,1,2,40,183,1,22,188,1,9,185,2,3,184,1,185,1,186,1,40,47,0,40,188,1,46,189,1,9,57,0,43,190,1,193,2,3,46,191,1,9,69,0,40,190,1,3,22,192,1,9,198,2,2,189,1,191,1,40,190,1,46,193,1,9,157,1,40,108,1,3,46,194,1,9,213,2,40,108,1,3,22,195,1,9,215,2,2,193,1,194,1,43,196,1,228,2,46,197,1,9,157,1,40,150,1,3,46,198,1,9,213,2,40,150,1,3,45,199,1,2,40,195,1,22,200,1,9,215,2,2,197,1,198,1,43,201,1,237,2,40,200,1,46,202,1,9,157,1,40,114,1,3,46,203,1,9,213,2,40,114,1,3,45,204,1,3,40,195,1,40,200,1,22,205,1,9,215,2,2,202,1,203,1,43,206,1,246,2,40,205,1,46,207,1,9,157,1,40,150,1,3,46,208,1,9,213,2,40,108,1,3,45,209,1,4,40,195,1,40,200,1,40,205,1,22,210,1,9,215,2,2,207,1,208,1,43,211,1,255,2,40,210,1,46,212,1,9,157,1,40,108,1,3,46,213,1,9,213,2,40,150,1,3,45,214,1,5,40,195,1,40,200,1,40,205,1,40,210,1,22,215,1,9,215,2,2,212,1,213,1,43,216,1,8,3,40,215,1,46,217,1,9,157,1,40,114,1,3,46,218,1,9,213,2,40,108,1,3,45,219,1,6,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,22,220,1,9,215,2,2,217,1,218,1,43,221,1,17,3,40,220,1,46,222,1,9,157,1,40,108,1,3,46,223,1,9,213,2,40,114,1,3,45,224,1,7,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,22,225,1,9,215,2,2,222,1,223,1,43,226,1,26,3,40,225,1,46,227,1,9,157,1,40,114,1,3,46,228,1,9,213,2,40,150,1,3,45,229,1,8,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,22,230,1,9,215,2,2,227,1,228,1,43,231,1,35,3,40,230,1,46,232,1,9,157,1,40,150,1,3,46,233,1,9,213,2,40,114,1,3,45,234,1,9,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,22,235,1,9,215,2,2,232,1,233,1,40,206,1,40,235,1,46,236,1,9,157,1,43,237,1,44,3,3,46,238,1,9,213,2,40,237,1,3,45,239,1,10,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,22,240,1,9,215,2,2,236,1,238,1,43,241,1,50,3,40,240,1,46,242,1,9,157,1,40,154,1,3,46,243,1,9,213,2,40,154,1,3,45,244,1,11,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,22,245,1,9,215,2,2,242,1,243,1,43,246,1,58,3,40,245,1,46,247,1,9,157,1,43,248,1,66,3,3,46,249,1,9,213,2,40,248,1,3,45,250,1,12,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,22,251,1,9,215,2,2,247,1,249,1,43,252,1,72,3,40,251,1,46,253,1,9,157,1,40,154,1,3,46,254,1,9,213,2,40,237,1,3,45,255,1,13,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,22,0,2,9,215,2,2,253,1,254,1,43,1,2,80,3,40,0,2,46,2,2,9,157,1,40,237,1,3,46,3,2,9,213,2,40,154,1,3,45,4,2,14,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,22,5,2,9,215,2,2,2,2,3,2,43,6,2,88,3,40,5,2,46,7,2,9,157,1,40,248,1,3,46,8,2,9,213,2,40,237,1,3,45,9,2,15,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,22,10,2,9,215,2,2,7,2,8,2,43,11,2,96,3,40,10,2,46,12,2,9,157,1,40,237,1,3,46,13,2,9,213,2,40,248,1,3,45,14,2,16,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,40,10,2,22,15,2,9,215,2,2,12,2,13,2,43,16,2,104,3,40,15,2,46,17,2,9,157,1,40,248,1,3,46,18,2,9,213,2,40,154,1,3,45,19,2,17,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,40,10,2,40,15,2,22,20,2,9,215,2,2,17,2,18,2,43,21,2,112,3,40,20,2,46,22,2,9,157,1,40,154,1,3,46,23,2,9,213,2,40,248,1,3,45,24,2,18,40,195,1,40,200,1,40,205,1,40,210,1,40,215,1,40,220,1,40,225,1,40,230,1,40,235,1,40,240,1,40,245,1,40,251,1,40,0,2,40,5,2,40,10,2,40,15,2,40,20,2,22,25,2,9,215,2,2,22,2,23,2,40,252,1,40,25,2,46,26,2,9,120,3,40,196,1,3,22,27,2,9,122,3,1,26,2,40,196,1,46,28,2,9,120,3,40,201,1,3,45,29,2,2,40,27,2,22,30,2,9,122,3,1,28,2,40,201,1,40,30,2,46,31,2,9,120,3,43,32,2,132,3,3,45,33,2,3,40,27,2,40,30,2,22,34,2,9,122,3,1,31,2,40,32,2,40,34,2,46,35,2,9,120,3,40,216,1,3,45,36,2,4,40,27,2,40,30,2,40,34,2,22,37,2,9,122,3,1,35,2,40,211,1,40,37,2,46,38,2,9,120,3,40,211,1,3,45,39,2,5,40,27,2,40,30,2,40,34,2,40,37,2,22,40,2,9,122,3,1,38,2,40,216,1,40,40,2,46,41,2,9,120,3,40,226,1,3,45,42,2,6,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,22,43,2,9,122,3,1,41,2,40,221,1,40,43,2,46,44,2,9,120,3,40,221,1,3,45,45,2,7,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,22,46,2,9,122,3,1,44,2,40,226,1,40,46,2,46,47,2,9,120,3,40,206,1,3,45,48,2,8,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,22,49,2,9,122,3,1,47,2,40,231,1,40,49,2,46,50,2,9,120,3,40,231,1,3,45,51,2,9,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,22,52,2,9,122,3,1,50,2,40,206,1,40,52,2,46,53,2,9,120,3,40,241,1,3,45,54,2,10,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,22,55,2,9,122,3,1,53,2,40,241,1,40,55,2,46,56,2,9,120,3,40,246,1,3,45,57,2,11,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,22,58,2,9,122,3,1,56,2,40,246,1,40,58,2,46,59,2,9,120,3,43,60,2,141,3,3,45,61,2,12,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,22,62,2,9,122,3,1,59,2,40,60,2,40,62,2,46,63,2,9,120,3,40,6,2,3,45,64,2,13,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,22,65,2,9,122,3,1,63,2,40,1,2,40,65,2,46,66,2,9,120,3,40,1,2,3,45,67,2,14,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,22,68,2,9,122,3,1,66,2,40,6,2,40,68,2,46,69,2,9,120,3,40,16,2,3,45,70,2,15,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,22,71,2,9,122,3,1,69,2,40,11,2,40,71,2,46,72,2,9,120,3,40,11,2,3,45,73,2,16,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,40,71,2,22,74,2,9,122,3,1,72,2,40,16,2,40,74,2,46,75,2,9,120,3,40,252,1,3,45,76,2,17,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,40,71,2,40,74,2,22,77,2,9,122,3,1,75,2,40,21,2,40,77,2,46,78,2,9,120,3,40,21,2,3,45,79,2,18,40,27,2,40,30,2,40,34,2,40,37,2,40,40,2,40,43,2,40,46,2,40,49,2,40,52,2,40,55,2,40,58,2,40,62,2,40,65,2,40,68,2,40,71,2,40,74,2,40,77,2,22,80,2,9,122,3,1,78,2,40,252,1,40,80,2,46,81,2,9,120,3,40,196,1,3,22,82,2,9,149,3,1,81,2,40,160,0,46,83,2,9,120,3,40,201,1,3,45,84,2,2,40,82,2,22,85,2,9,149,3,1,83,2,40,160,0,40,85,2,46,86,2,9,120,3,40,32,2,3,45,87,2,3,40,82,2,40,85,2,22,88,2,9,149,3,1,86,2,40,160,0,40,88,2,46,89,2,9,120,3,40,241,1,3,45,90,2,4,40,82,2,40,85,2,40,88,2,22,91,2,9,149,3,1,89,2,40,168,0,40,91,2,46,92,2,9,120,3,40,246,1,3,45,93,2,5,40,82,2,40,85,2,40,88,2,40,91,2,22,94,2,9,149,3,1,92,2,40,168,0,40,94,2,46,95,2,9,120,3,40,60,2,3,45,96,2,6,40,82,2,40,85,2,40,88,2,40,91,2,40,94,2,22,97,2,9,149,3,1,95,2,40,168,0,40,97,2,46,98,2,9,120,3,40,196,1,3,22,99,2,9,161,3,1,98,2,40,196,1,46,100,2,9,120,3,40,201,1,3,45,101,2,2,40,99,2,22,102,2,9,161,3,1,100,2,40,201,1,40,102,2,46,103,2,9,120,3,40,32,2,3,45,104,2,3,40,99,2,40,102,2,22,105,2,9,161,3,1,103,2,40,32,2,40,105,2,46,106,2,9,120,3,40,241,1,3,45,107,2,4,40,99,2,40,102,2,40,105,2,22,108,2,9,161,3,1,106,2,40,241,1,40,108,2,46,109,2,9,120,3,40,246,1,3,45,110,2,5,40,99,2,40,102,2,40,105,2,40,108,2,22,111,2,9,161,3,1,109,2,40,246,1,40,111,2,46,112,2,9,120,3,40,60,2,3,45,113,2,6,40,99,2,40,102,2,40,105,2,40,108,2,40,111,2,22,114,2,9,161,3,1,112,2,40,60,2,40,114,2,46,115,2,9,57,0,43,116,2,169,3,3,46,117,2,9,69,0,40,116,2,3,22,118,2,9,174,3,2,115,2,117,2,43,119,2,183,3,46,120,2,9,57,0,43,121,2,189,3,3,46,122,2,9,69,0,40,121,2,3,45,123,2,2,40,118,2,22,124,2,9,174,3,2,120,2,122,2,40,119,2,40,124,2,46,125,2,9,57,0,43,126,2,195,3,3,46,127,2,9,69,0,40,126,2,3,45,128,2,3,40,118,2,40,124,2,22,129,2,9,174,3,2,125,2,127,2,40,119,2,40,129,2,46,130,2,9,57,0,43,131,2,201,3,3,46,132,2,9,69,0,40,131,2,3,45,133,2,4,40,118,2,40,124,2,40,129,2,22,134,2,9,174,3,2,130,2,132,2,40,119,2,40,134,2,46,135,2,9,57,0,43,136,2,207,3,3,46,137,2,9,69,0,40,136,2,3,45,138,2,5,40,118,2,40,124,2,40,129,2,40,134,2,22,139,2,9,174,3,2,135,2,137,2,40,119,2,40,139,2,46,140,2,9,57,0,43,141,2,214,3,3,46,142,2,9,69,0,40,141,2,3,45,143,2,6,40,118,2,40,124,2,40,129,2,40,134,2,40,139,2,22,144,2,9,174,3,2,140,2,142,2,40,119,2,40,144,2,46,145,2,9,57,0,40,116,2,3,46,146,2,9,69,0,40,116,2,3,22,147,2,9,220,3,2,145,2,146,2,40,119,2,46,148,2,9,57,0,40,121,2,3,46,149,2,9,69,0,40,121,2,3,45,150,2,2,40,147,2,22,151,2,9,220,3,2,148,2,149,2,40,119,2,40,151,2,46,152,2,9,57,0,40,126,2,3,46,153,2,9,69,0,40,126,2,3,45,154,2,3,40,147,2,40,151,2,22,155,2,9,220,3,2,152,2,153,2,40,119,2,40,155,2,46,156,2,9,57,0,40,141,2,3,46,157,2,9,69,0,40,141,2,3,45,158,2,4,40,147,2,40,151,2,40,155,2,22,159,2,9,220,3,2,156,2,157,2,40,119,2,40,159,2,46,160,2,9,57,0,40,131,2,3,46,161,2,9,69,0,40,131,2,3,45,162,2,5,40,147,2,40,151,2,40,155,2,40,159,2,22,163,2,9,220,3,2,160,2,161,2,40,119,2,40,163,2,46,164,2,9,57,0,40,136,2,3,46,165,2,9,69,0,40,136,2,3,45,166,2,6,40,147,2,40,151,2,40,155,2,40,159,2,40,163,2,22,167,2,9,220,3,2,164,2,165,2,40,119,2,40,167,2,46,168,2,9,57,0,40,116,2,3,46,169,2,9,69,0,40,116,2,3,22,170,2,9,234,3,2,168,2,169,2,40,119,2,46,171,2,9,57,0,40,121,2,3,46,172,2,9,69,0,40,121,2,3,45,173,2,2,40,170,2,22,174,2,9,234,3,2,171,2,172,2,40,119,2,40,174,2,46,175,2,9,57,0,40,126,2,3,46,176,2,9,69,0,40,126,2,3,45,177,2,3,40,170,2,40,174,2,22,178,2,9,234,3,2,175,2,176,2,40,119,2,40,178,2,46,179,2,9,57,0,40,141,2,3,46,180,2,9,69,0,40,141,2,3,45,181,2,4,40,170,2,40,174,2,40,178,2,22,182,2,9,234,3,2,179,2,180,2,40,119,2,40,182,2,46,183,2,9,57,0,40,131,2,3,46,184,2,9,69,0,40,131,2,3,45,185,2,5,40,170,2,40,174,2,40,178,2,40,182,2,22,186,2,9,234,3,2,183,2,184,2,40,119,2,40,186,2,46,187,2,9,57,0,40,136,2,3,46,188,2,9,69,0,40,136,2,3,45,189,2,6,40,170,2,40,174,2,40,178,2,40,182,2,40,186,2,22,190,2,9,234,3,2,187,2,188,2,40,119,2,40,190,2,46,191,2,9,57,0,40,116,2,3,46,192,2,9,69,0,40,116,2,3,22,193,2,9,246,3,2,191,2,192,2,40,119,2,46,194,2,9,57,0,40,121,2,3,46,195,2,9,69,0,40,121,2,3,45,196,2,2,40,193,2,22,197,2,9,246,3,2,194,2,195,2,40,119,2,40,197,2,46,198,2,9,57,0,40,126,2,3,46,199,2,9,69,0,40,126,2,3,45,200,2,3,40,193,2,40,197,2,22,201,2,9,246,3,2,198,2,199,2,40,119,2,40,201,2,46,202,2,9,57,0,40,141,2,3,46,203,2,9,69,0,40,141,2,3,45,204,2,4,40,193,2,40,197,2,40,201,2,22,205,2,9,246,3,2,202,2,203,2,40,119,2,40,205,2,46,206,2,9,57,0,40,131,2,3,46,207,2,9,69,0,40,131,2,3,45,208,2,5,40,193,2,40,197,2,40,201,2,40,205,2,22,209,2,9,246,3,2,206,2,207,2,40,119,2,40,209,2,46,210,2,9,57,0,40,136,2,3,46,211,2,9,69,0,40,136,2,3,45,212,2,6,40,193,2,40,197,2,40,201,2,40,205,2,40,209,2,22,213,2,9,246,3,2,210,2,211,2,40,119,2,40,213,2,46,214,2,9,57,0,40,116,2,3,46,215,2,9,69,0,40,116,2,3,22,216,2,9,7,4,2,214,2,215,2,40,119,2,46,217,2,9,57,0,40,121,2,3,46,218,2,9,69,0,40,121,2,3,45,219,2,2,40,216,2,22,220,2,9,7,4,2,217,2,218,2,40,119,2,40,220,2,46,221,2,9,57,0,40,126,2,3,46,222,2,9,69,0,40,126,2,3,45,223,2,3,40,216,2,40,220,2,22,224,2,9,7,4,2,221,2,222,2,40,119,2,40,224,2,46,225,2,9,57,0,40,141,2,3,46,226,2,9,69,0,40,141,2,3,45,227,2,4,40,216,2,40,220,2,40,224,2,22,228,2,9,7,4,2,225,2,226,2,40,119,2,40,228,2,46,229,2,9,57,0,40,131,2,3,46,230,2,9,69,0,40,131,2,3,45,231,2,5,40,216,2,40,220,2,40,224,2,40,228,2,22,232,2,9,7,4,2,229,2,230,2,40,119,2,40,232,2,46,233,2,9,57,0,40,136,2,3,46,234,2,9,69,0,40,136,2,3,45,235,2,6,40,216,2,40,220,2,40,224,2,40,228,2,40,232,2,22,236,2,9,7,4,2,233,2,234,2,40,119,2,40,236,2,46,237,2,9,57,0,40,119,2,3,46,238,2,9,69,0,40,119,2,3,45,239,2,7,40,216,2,40,220,2,40,224,2,40,228,2,40,232,2,40,236,2,22,240,2,9,7,4,2,237,2,238,2,40,119,2,40,240,2,46,241,2,9,57,0,40,116,2,3,46,242,2,9,69,0,40,116,2,3,22,243,2,9,13,4,2,241,2,242,2,40,119,2,46,244,2,9,57,0,40,121,2,3,46,245,2,9,69,0,40,121,2,3,45,246,2,2,40,243,2,22,247,2,9,13,4,2,244,2,245,2,40,119,2,40,247,2,46,248,2,9,57,0,40,126,2,3,46,249,2,9,69,0,40,126,2,3,45,250,2,3,40,243,2,40,247,2,22,251,2,9,13,4,2,248,2,249,2,40,119,2,40,251,2,46,252,2,9,57,0,40,141,2,3,46,253,2,9,69,0,40,141,2,3,45,254,2,4,40,243,2,40,247,2,40,251,2,22,255,2,9,13,4,2,252,2,253,2,40,119,2,40,255,2,46,0,3,9,57,0,40,131,2,3,46,1,3,9,69,0,40,131,2,3,45,2,3,5,40,243,2,40,247,2,40,251,2,40,255,2,22,3,3,9,13,4,2,0,3,1,3,40,119,2,40,3,3,46,4,3,9,57,0,40,136,2,3,46,5,3,9,69,0,40,136,2,3,45,6,3,6,40,243,2,40,247,2,40,251,2,40,255,2,40,3,3,22,7,3,9,13,4,2,4,3,5,3,40,119,2,40,7,3,46,8,3,9,57,0,40,119,2,3,46,9,3,9,69,0,40,119,2,3,45,10,3,7,40,243,2,40,247,2,40,251,2,40,255,2,40,3,3,40,7,3,22,11,3,9,13,4,2,8,3,9,3,40,119,2,40,11,3,46,12,3,9,57,0,40,119,2,3,22,13,3,9,22,4,1,12,3,43,14,3,26,4,46,15,3,9,57,0,40,119,2,3,22,16,3,9,31,4,1,15,3,40,14,3,46,17,3,9,57,0,40,119,2,3,22,18,3,9,35,4,1,17,3,40,119,2,46,19,3,9,93,1,40,117,0,3,22,20,3,9,39,4,1,19,3,40,117,0,46,21,3,9,93,1,40,90,1,3,45,22,3,2,40,20,3,22,23,3,9,39,4,1,21,3,40,117,0,40,23,3,46,24,3,9,93,1,40,117,0,3,22,25,3,9,48,4,1,24,3,40,117,0,46,26,3,9,93,1,40,90,1,3,45,27,3,2,40,25,3,22,28,3,9,48,4,1,26,3,40,117,0,40,28,3,46,29,3,9,93,1,40,117,0,3,22,30,3,9,56,4,1,29,3,40,117,0,46,31,3,9,93,1,40,90,1,3,45,32,3,2,40,30,3,22,33,3,9,56,4,1,31,3,40,117,0,40,33,3,46,34,3,9,64,4,43,35,3,72,4,3,46,36,3,9,82,4,43,37,3,82,4,3,22,38,3,9,90,4,2,34,3,36,3,43,39,3,104,4,46,40,3,9,82,4,43,41,3,114,4,3,22,42,3,9,130,4,1,40,3,43,43,3,142,4,46,44,3,9,82,4,43,45,3,147,4,3,46,46,3,9,159,4,40,160,0,3,22,47,3,9,161,4,2,44,3,46,3,40,248,1,46,48,3,9,82,4,40,45,3,3,46,49,3,9,159,4,40,160,0,3,46,50,3,9,168,4,40,160,0,3,45,51,3,2,40,47,3,22,52,3,9,161,4,3,48,3,49,3,50,3,40,248,1,40,52,3,46,53,3,9,82,4,43,54,3,173,4,3,46,55,3,9,159,4,40,108,1,3,45,56,3,3,40,47,3,40,52,3,22,57,3,9,161,4,2,53,3,55,3,40,248,1,40,57,3,46,58,3,9,82,4,43,59,3,185,4,3,46,60,3,9,159,4,40,108,1,3,45,61,3,4,40,47,3,40,52,3,40,57,3,22,62,3,9,161,4,2,58,3,60,3,43,63,3,196,4,40,62,3,46,64,3,9,82,4,43,65,3,201,4,3,46,66,3,9,159,4,40,108,1,3,46,67,3,9,168,4,40,160,0,3,45,68,3,5,40,47,3,40,52,3,40,57,3,40,62,3,22,69,3,9,161,4,3,64,3,66,3,67,3,40,248,1,40,69,3,46,70,3,9,82,4,40,65,3,3,46,71,3,9,159,4,40,108,1,3,45,72,3,6,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,22,73,3,9,161,4,2,70,3,71,3,40,248,1,40,73,3,46,74,3,9,82,4,40,41,3,3,46,75,3,9,159,4,40,108,1,3,45,76,3,7,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,22,77,3,9,161,4,2,74,3,75,3,40,248,1,40,77,3,46,78,3,9,82,4,40,41,3,3,46,79,3,9,159,4,40,150,1,3,45,80,3,8,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,22,81,3,9,161,4,2,78,3,79,3,40,248,1,40,81,3,46,82,3,9,220,4,43,83,3,228,4,3,22,84,3,9,241,4,1,82,3,40,248,1,46,85,3,9,220,4,43,86,3,253,4,3,46,87,3,9,161,4,40,203,0,3,45,88,3,2,40,84,3,22,89,3,9,241,4,2,85,3,87,3,40,248,1,40,89,3,46,90,3,9,82,4,40,45,3,3,46,91,3,9,159,4,40,108,1,3,45,92,3,9,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,22,93,3,9,161,4,2,90,3,91,3,40,248,1,40,93,3,46,94,3,9,82,4,40,45,3,3,46,95,3,9,159,4,40,108,1,3,46,96,3,9,168,4,40,160,0,3,45,97,3,10,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,40,93,3,22,98,3,9,161,4,3,94,3,95,3,96,3,40,248,1,40,98,3,46,99,3,9,82,4,40,54,3,3,46,100,3,9,159,4,40,150,1,3,45,101,3,11,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,40,93,3,40,98,3,22,102,3,9,161,4,2,99,3,100,3,40,248,1,40,102,3,46,103,3,9,82,4,40,54,3,3,46,104,3,9,159,4,40,150,1,3,46,105,3,9,168,4,40,160,0,3,45,106,3,12,40,47,3,40,52,3,40,57,3,40,62,3,40,69,3,40,73,3,40,77,3,40,81,3,40,93,3,40,98,3,40,102,3,22,107,3,9,161,4,3,103,3,104,3,105,3,40,248,1,40,107,3,46,108,3,9,12,5,43,109,3,18,5,3,46,110,3,9,159,4,40,43,3,3,22,111,3,9,26,5,2,108,3,110,3,40,114,1,46,112,3,9,12,5,43,113,3,36,5,3,46,114,3,9,159,4,40,43,3,3,45,115,3,2,40,111,3,22,116,3,9,26,5,2,112,3,114,3,40,63,3,40,116,3,46,117,3,9,250,1,40,3,0,3,22,118,3,9,45,5,1,117,3,40,3,0,46,119,3,9,250,1,40,3,0,3,22,120,3,9,50,5,1,119,3,40,3,0,46,121,3,9,250,1,40,47,0,3,45,122,3,2,40,118,3,22,123,3,9,45,5,1,121,3,40,47,0,40,123,3,46,124,3,9,250,1,40,47,0,3,45,125,3,2,40,120,3,22,126,3,9,50,5,1,124,3,40,47,0,40,126,3,46,127,3,9,250,1,40,3,0,3,22,128,3,9,55,5,1,127,3,40,3,0,46,129,3,9,250,1,40,47,0,3,45,130,3,2,40,128,3,22,131,3,9,55,5,1,129,3,40,47,0,40,131,3,46,132,3,9,62,5,40,160,0,3,46,133,3,9,161,4,40,203,0,3,22,134,3,9,74,5,2,132,3,133,3,40,160,0,46,135,3,9,62,5,40,108,1,3,46,136,3,9,161,4,40,203,0,3,45,137,3,2,40,134,3,22,138,3,9,74,5,2,135,3,136,3,40,108,1,40,138,3,46,139,3,9,62,5,40,150,1,3,46,140,3,9,161,4,40,203,0,3,45,141,3,3,40,134,3,40,138,3,22,142,3,9,74,5,2,139,3,140,3,40,150,1,40,142,3,46,143,3,9,62,5,40,114,1,3,46,144,3,9,161,4,40,203,0,3,45,145,3,4,40,134,3,40,138,3,40,142,3,22,146,3,9,74,5,2,143,3,144,3,40,114,1,40,146,3,46,147,3,9,62,5,40,160,0,3,46,148,3,9,94,5,40,108,1,3,22,149,3,9,101,5,2,147,3,148,3,40,160,0,46,150,3,9,62,5,40,108,1,3,46,151,3,9,94,5,40,108,1,3,45,152,3,2,40,149,3,22,153,3,9,101,5,2,150,3,151,3,40,108,1,40,153,3,46,154,3,9,62,5,40,150,1,3,46,155,3,9,94,5,40,108,1,3,45,156,3,3,40,149,3,40,153,3,22,157,3,9,101,5,2,154,3,155,3,40,150,1,40,157,3,46,158,3,9,62,5,40,114,1,3,46,159,3,9,94,5,40,108,1,3,45,160,3,4,40,149,3,40,153,3,40,157,3,22,161,3,9,101,5,2,158,3,159,3,40,114,1,40,161,3,46,162,3,9,121,5,40,248,1,3,46,163,3,9,125,5,40,248,1,3,22,164,3,9,129,5,2,162,3,163,3,40,248,1,46,165,3,9,121,5,40,248,1,3,46,166,3,9,125,5,40,248,1,3,22,167,3,9,141,5,2,165,3,166,3,40,248,1,46,168,3,9,121,5,40,248,1,3,46,169,3,9,125,5,40,248,1,3,22,170,3,9,151,5,2,168,3,169,3,40,248,1,46,171,3,9,121,5,40,248,1,3,46,172,3,9,125,5,40,248,1,3,22,173,3,9,161,5,2,171,3,172,3,40,248,1,46,174,3,9,121,5,40,248,1,3,46,175,3,9,125,5,40,248,1,3,22,176,3,9,176,5,2,174,3,175,3,40,248,1,46,177,3,9,121,5,40,248,1,3,46,178,3,9,125,5,40,248,1,3,22,179,3,9,191,5,2,177,3,178,3,40,248,1,46,180,3,9,121,5,40,248,1,3,46,181,3,9,125,5,40,248,1,3,22,182,3,9,204,5,2,180,3,181,3,40,248,1,46,183,3,9,121,5,40,248,1,3,46,184,3,9,125,5,40,248,1,3,22,185,3,9,217,5,2,183,3,184,3,40,248,1,46,186,3,9,121,5,40,248,1,3,46,187,3,9,125,5,40,248,1,3,22,188,3,9,231,5,2,186,3,187,3,40,248,1,46,189,3,9,121,5,40,248,1,3,46,190,3,9,125,5,40,248,1,3,22,191,3,9,245,5,2,189,3,190,3,40,248,1,46,192,3,9,121,5,40,248,1,3,46,193,3,9,125,5,40,248,1,3,22,194,3,9,4,6,2,192,3,193,3,40,248,1,46,195,3,9,121,5,40,248,1,3,46,196,3,9,125,5,40,248,1,3,22,197,3,9,19,6,2,195,3,196,3,40,248,1,46,198,3,9,121,5,40,248,1,3,46,199,3,9,125,5,40,248,1,3,22,200,3,9,29,6,2,198,3,199,3,40,248,1,46,201,3,9,121,5,40,248,1,3,46,202,3,9,125,5,40,248,1,3,22,203,3,9,40,6,2,201,3,202,3,40,248,1,46,204,3,9,121,5,40,248,1,3,46,205,3,9,125,5,40,248,1,3,22,206,3,9,55,6,2,204,3,205,3,40,248,1,46,207,3,9,68,6,40,237,1,3,46,208,3,9,70,6,40,237,1,3,22,209,3,9,72,6,2,207,3,208,3,40,168,0,46,210,3,9,121,5,40,248,1,3,46,211,3,9,125,5,40,248,1,3,22,212,3,9,97,6,2,210,3,211,3,40,248,1,46,213,3,9,121,5,40,248,1,3,46,214,3,9,125,5,40,248,1,3,22,215,3,9,111,6,2,213,3,214,3,40,248,1,46,216,3,9,121,5,40,248,1,3,46,217,3,9,125,5,40,248,1,3,22,218,3,9,124,6,2,216,3,217,3,40,248,1,46,219,3,9,138,6,40,168,0,3,46,220,3,9,70,6,40,168,0,3,22,221,3,9,140,6,2,219,3,220,3,40,168,0,46,222,3,9,68,6,40,237,1,3,46,223,3,9,70,6,40,237,1,3,22,224,3,9,156,6,2,222,3,223,3,40,168,0,46,225,3,9,121,5,40,248,1,3,46,226,3,9,125,5,40,248,1,3,22,227,3,9,179,6,2,225,3,226,3,40,248,1,46,228,3,9,68,6,40,237,1,3,46,229,3,9,70,6,40,237,1,3,22,230,3,9,197,6,2,228,3,229,3,40,168,0,46,231,3,9,121,5,40,248,1,3,46,232,3,9,125,5,40,248,1,3,22,233,3,9,219,6,2,231,3,232,3,40,248,1,46,234,3,9,121,5,40,248,1,3,46,235,3,9,125,5,40,248,1,3,22,236,3,9,236,6,2,234,3,235,3,40,248,1,46,237,3,9,68,6,40,237,1,3,46,238,3,9,70,6,40,237,1,3,22,239,3,9,253,6,2,237,3,238,3,40,168,0,46,240,3,9,121,5,40,248,1,3,46,241,3,9,125,5,40,248,1,3,22,242,3,9,19,7,2,240,3,241,3,40,248,1,46,243,3,9,121,5,40,248,1,3,46,244,3,9,125,5,40,248,1,3,22,245,3,9,36,7,2,243,3,244,3,40,248,1,46,246,3,9,121,5,40,248,1,3,46,247,3,9,125,5,40,248,1,3,22,248,3,9,53,7,2,246,3,247,3,40,248,1,46,249,3,9,121,5,40,248,1,3,46,250,3,9,125,5,40,248,1,3,22,251,3,9,69,7,2,249,3,250,3,40,248,1,46,252,3,9,84,7,40,154,1,3,22,253,3,9,90,7,1,252,3,40,168,0,46,254,3,9,113,7,40,154,1,3,46,255,3,9,125,7,40,168,0,3,46,0,4,9,131,7,40,154,1,3,22,1,4,9,140,7,3,254,3,255,3,0,4,40,154,1,46,2,4,9,84,7,40,154,1,3,22,3,4,9,167,7,1,2,4,40,168,0,46,4,4,9,191,7,40,154,1,3,46,5,4,9,201,7,40,168,0,3,22,6,4,9,205,7,2,4,4,5,4,40,154,1,46,7,4,9,240,7,40,154,1,3,46,8,4,9,252,7,40,154,1,3,22,9,4,9,5,8,2,7,4,8,4,40,154,1,46,10,4,9,121,5,40,248,1,3,46,11,4,9,125,5,40,248,1,3,22,12,4,9,33,8,2,10,4,11,4,40,248,1,46,13,4,9,121,5,40,248,1,3,46,14,4,9,125,5,40,248,1,3,22,15,4,9,43,8,2,13,4,14,4,40,248,1,46,16,4,9,121,5,40,248,1,3,46,17,4,9,125,5,40,248,1,3,22,18,4,9,60,8,2,16,4,17,4,40,248,1,46,19,4,9,121,5,40,248,1,3,46,20,4,9,125,5,40,248,1,3,22,21,4,9,72,8,2,19,4,20,4,40,248,1,46,22,4,9,89,8,40,1,0,3,46,23,4,9,121,5,40,248,1,3,46,24,4,9,125,5,40,248,1,3,22,25,4,9,94,8,3,22,4,23,4,24,4,40,248,1,46,26,4,9,84,7,40,248,1,3,22,27,4,9,100,8,1,26,4,40,248,1,46,28,4,9,84,7,40,114,1,3,22,29,4,9,109,8,1,28,4,40,114,1,46,30,4,9,250,1,40,150,1,3,22,31,4,9,124,8,1,30,4,40,108,1,135,0,2,0,0,0,90,7,196,3,167,7,202,3,72,6,152,3,140,7,200,3,5,8,208,3,205,7,205,3,197,6,173,3,156,6,167,3,140,6,164,3,253,6,182,3,167,0,114,0,64,0,60,0,106,0,82,0,31,4,229,2,22,4,227,2,59,0,57,0,100,0,79,0,71,0,67,0,112,0,85,0,39,4,235,2,94,8,224,3,129,5,107,3,60,8,217,3,219,6,176,3,179,6,170,3,111,6,158,3,36,7,188,3,151,5,113,3,4,6,137,3,204,5,125,3,231,5,131,3,176,5,119,3,53,7,191,3,236,6,179,3,33,8,211,3,124,6,161,3,72,8,220,3,40,6,146,3,69,7,194,3,97,6,155,3,29,6,143,3,43,8,214,3,55,6,149,3,19,7,185,3,141,5,110,3,245,5,134,3,191,5,122,3,217,5,128,3,161,5,116,3,19,6,140,3,214,0,147,0,17,1,249,0,49,0,51,0,90,0,73,0,119,2,142,1,45,5,65,3,50,5,68,3,149,3,61,2,99,2,128,1,108,2,135,1,7,4,197,2,122,0,92,0,130,0,98,0,161,2,157,1,48,4,240,2,56,4,245,2,99,1,78,1,186,0,127,0,159,1,90,1,219,0,152,0,163,1,94,1,141,2,149,1,55,5,73,3,234,3,147,2,246,3,170,2,26,5,58,3,114,1,80,1,101,5,103,3,74,5,88,3,161,3,78,2,155,0,107,0,87,1,76,1,81,1,74,1,169,1,97,1,86,2,121,1,174,3,101,2,220,3,124,2,126,0,95,0,135,0,101,0,90,4,249,2,198,2,177,1,255,0,220,0,247,0,197,0,34,1,37,1,231,0,167,0,242,0,174,0,131,2,147,1,35,4,231,2,13,4,224,2,215,2,247,1,58,2,115,1,203,1,101,1,237,1,105,1,184,1,99,1,224,1,103,1,118,0,89,0,124,8,230,3,31,0,45,0,173,2,164,1,185,2,173,1,198,0,137,0,204,0,142,0,161,4,51,3,23,1,254,0,181,0,122,0,45,0,48,0,85,0,70,0,70,1,71,1,140,0,104,0,53,1,52,1,241,4,33,3,53,0,54,0,95,0,76,0,130,4,251,2,122,3,44,2,192,0,132,0,139,1,82,1,71,2,117,1,12,2,109,1,43,2,113,1,252,1,107,1,28,2,111,1,100,8,226,3,109,8,228,3,12,44,21,164,3,2,42,0,0,0,0,1,35,6,40,248,1,1,18,0,0,0,0,1,0,21,167,3,2,42,0,0,0,0,1,35,49,165,3,0,1,0,21,170,3,2,42,0,0,0,0,1,35,49,169,3,0,1,0,21,173,3,2,42,0,0,0,0,1,35,1,49,171,3,0,57,1,1,18,0,0,128,63,58,39,49,171,3,0,1,3,40,168,0,59,49,172,3,0,40,248,1,40,248,1,1,0,21,176,3,2,42,0,0,0,0,1,35,1,1,1,18,0,0,128,63,58,39,49,175,3,0,1,3,40,168,0,59,49,174,3,0,40,248,1,57,49,175,3,0,40,248,1,1,0,21,179,3,2,42,0,0,0,0,1,35,44,36,129,8,3,0,44,1,49,177,3,0,76,6,40,248,1,1,18,0,0,0,0,40,14,3,6,40,248,1,1,18,0,0,0,0,1,49,177,3,0,59,39,49,178,3,0,1,3,40,248,1,1,49,177,3,0,59,39,49,178,3,0,1,3,40,248,1,1,0,21,182,3,2,42,0,0,0,0,1,35,20,40,248,1,179,3,2,49,181,3,0,49,180,3,0,1,1,179,3,21,185,3,2,42,0,0,0,0,1,35,1,1,18,0,0,128,63,58,39,49,184,3,0,1,3,40,168,0,59,49,183,3,0,40,248,1,1,0,21,188,3,2,42,0,0,0,0,1,35,1,1,18,0,0,128,63,58,39,49,186,3,0,1,3,40,168,0,59,49,187,3,0,40,248,1,1,0,21,191,3,2,42,0,0,0,0,1,35,1,1,39,49,190,3,0,1,3,59,49,189,3,0,40,248,1,57,1,1,18,0,0,128,63,58,39,49,189,3,0,1,3,40,168,0,59,49,190,3,0,40,248,1,40,248,1,1,0,21,194,3,2,42,0,0,0,0,1,35,1,1,1,18,0,0,128,63,58,39,49,193,3,0,1,3,40,168,0,59,49,192,3,0,40,248,1,57,1,39,49,192,3,0,1,3,59,49,193,3,0,40,248,1,40,248,1,1,0,21,197,3,2,42,0,0,0,0,1,35,1,1,1,18,0,0,128,63,58,39,49,196,3,0,1,3,40,168,0,59,49,195,3,0,40,248,1,57,1,1,18,0,0,128,63,58,39,49,195,3,0,1,3,40,168,0,59,49,196,3,0,40,248,1,40,248,1,1,0,21,200,3,2,42,0,0,0,0,1,35,20,40,248,1,196,0,2,1,49,198,3,0,57,49,199,3,0,40,248,1,18,0,0,128,63,1,0,21,203,3,2,42,0,0,0,0,1,35,1,49,201,3,0,59,49,202,3,0,40,248,1,1,0,21,206,3,2,42,0,0,0,0,1,35,1,49,204,3,0,57,1,1,18,0,0,128,63,58,49,204,3,0,40,248,1,59,49,205,3,0,40,248,1,40,248,1,1,0,21,209,3,2,42,0,0,0,0,1,35,44,1,1,18,0,0,0,64,59,39,49,208,3,0,1,0,40,168,0,81,39,49,208,3,0,1,1,40,14,3,1,1,18,0,0,0,64,59,39,49,207,3,0,1,0,40,168,0,59,39,49,208,3,0,1,0,40,168,0,1,1,39,49,207,3,0,1,1,59,39,49,208,3,0,1,1,40,168,0,58,1,1,18,0,0,0,64,59,1,39,49,208,3,0,1,1,58,39,49,208,3,0,1,0,40,168,0,40,168,0,59,1,39,49,207,3,0,1,1,58,39,49,207,3,0,1,0,40,168,0,40,168,0,40,168,0,1,0,21,212,3,2,42,1,0,46,32,4,9,175,8,40,248,1,2,1,0,175,8,0,0,3,47,32,4,40,248,1,0,6,40,248,1,4,20,40,168,0,209,3,2,39,49,210,3,0,2,0,3,39,49,211,3,0,2,0,3,20,40,168,0,209,3,2,39,49,210,3,0,2,1,3,39,49,211,3,0,2,1,3,20,40,168,0,209,3,2,39,49,210,3,0,2,2,3,39,49,211,3,0,2,2,3,1,39,49,210,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,210,3,0,1,3,40,168,0,59,39,49,211,3,0,1,3,40,168,0,40,168,0,15,1,39,49,32,4,2,3,0,1,2,82,1,1,39,49,211,3,0,3,0,1,2,59,1,18,0,0,128,63,58,39,49,210,3,0,1,3,40,168,0,40,154,1,57,1,39,49,210,3,0,3,0,1,2,59,1,18,0,0,128,63,58,39,49,211,3,0,1,3,40,168,0,40,154,1,40,154,1,40,154,1,35,49,32,4,0,1,1,209,3,21,215,3,2,42,1,0,46,33,4,9,175,8,40,248,1,2,1,0,175,8,0,0,3,47,33,4,40,248,1,0,20,40,248,1,173,3,2,49,213,3,0,49,214,3,0,15,1,39,49,33,4,1,3,0,1,2,75,20,40,154,1,192,0,2,39,49,33,4,0,3,0,1,2,1,1,1,18,0,0,128,63,58,39,49,214,3,0,1,3,40,168,0,59,39,49,213,3,0,3,0,1,2,40,154,1,57,39,49,214,3,0,3,0,1,2,40,154,1,40,154,1,35,49,33,4,0,1,1,173,3,21,218,3,2,42,1,0,46,34,4,9,175,8,40,248,1,2,1,0,175,8,0,0,3,47,34,4,40,248,1,0,20,40,248,1,173,3,2,49,216,3,0,49,217,3,0,15,1,39,49,34,4,1,3,0,1,2,75,20,40,154,1,216,0,2,39,49,34,4,0,3,0,1,2,1,1,1,18,0,0,128,63,58,39,49,217,3,0,1,3,40,168,0,59,39,49,216,3,0,3,0,1,2,40,154,1,57,39,49,217,3,0,3,0,1,2,40,154,1,40,154,1,35,49,34,4,0,1,1,173,3,21,221,3,2,42,0,0,0,0,1,35,44,36,182,8,3,0,1,49,219,3,0,60,1,49,220,3,0,57,18,119,204,43,50,40,168,0,40,168,0,1,49,219,3,0,60,49,220,3,0,40,168,0,1,0,21,224,3,2,42,0,0,0,0,1,23,0,1,39,49,223,3,0,1,0,76,18,0,0,0,0,40,14,3,2,42,0,0,0,0,1,35,1,39,49,222,3,0,1,0,59,1,18,0,0,128,63,58,39,49,223,3,0,1,1,40,168,0,40,168,0,1,2,42,1,0,46,35,4,9,234,8,40,168,0,2,1,0,234,8,0,0,2,47,35,4,40,168,0,0,1,39,49,222,3,0,1,1,58,39,49,222,3,0,1,0,40,168,0,23,0,1,49,35,4,0,76,18,0,0,0,0,40,14,3,2,42,0,0,0,0,1,35,1,1,1,39,49,222,3,0,1,1,59,39,49,223,3,0,1,1,40,168,0,57,1,39,49,222,3,0,1,0,59,1,18,0,0,128,63,58,39,49,223,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,223,3,0,1,0,59,1,18,0,0,128,63,58,39,49,222,3,0,1,1,40,168,0,40,168,0,40,168,0,1,2,42,0,0,0,0,2,15,1,49,35,4,1,75,20,40,168,0,192,0,2,39,49,223,3,0,1,1,20,40,168,0,221,3,2,1,39,49,223,3,0,1,0,59,39,49,222,3,0,1,1,40,168,0,49,35,4,0,40,168,0,35,1,1,1,49,35,4,0,59,39,49,222,3,0,1,1,40,168,0,57,1,39,49,222,3,0,1,0,59,1,18,0,0,128,63,58,39,49,223,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,223,3,0,1,0,59,1,18,0,0,128,63,58,39,49,222,3,0,1,1,40,168,0,40,168,0,40,168,0,1,1,1,1,221,3,21,227,3,2,42,0,0,0,0,1,35,6,40,248,1,4,20,40,168,0,224,3,2,39,49,225,3,0,2,0,3,39,49,226,3,0,2,0,3,20,40,168,0,224,3,2,39,49,225,3,0,2,1,3,39,49,226,3,0,2,1,3,20,40,168,0,224,3,2,39,49,225,3,0,2,2,3,39,49,226,3,0,2,2,3,1,39,49,225,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,225,3,0,1,3,40,168,0,59,39,49,226,3,0,1,3,40,168,0,40,168,0,1,1,224,3,21,230,3,2,42,0,0,0,0,1,23,0,1,39,49,229,3,0,1,1,76,39,49,229,3,0,1,0,40,14,3,2,42,0,0,0,0,1,35,1,1,1,39,49,228,3,0,1,1,59,39,49,229,3,0,1,1,40,168,0,57,1,39,49,228,3,0,1,0,59,1,18,0,0,128,63,58,39,49,229,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,229,3,0,1,0,59,1,18,0,0,128,63,58,39,49,228,3,0,1,1,40,168,0,40,168,0,40,168,0,1,23,0,1,39,49,228,3,0,1,0,76,18,0,0,0,0,40,14,3,2,42,0,0,0,0,1,35,1,39,49,229,3,0,1,0,59,1,18,0,0,128,63,58,39,49,228,3,0,1,1,40,168,0,40,168,0,1,2,42,1,0,46,36,4,9,234,8,40,168,0,2,1,0,234,8,0,0,2,47,36,4,40,168,0,0,20,40,168,0,216,0,2,18,0,0,0,0,1,39,49,229,3,0,1,1,58,20,40,168,0,221,3,2,1,1,39,49,229,3,0,1,1,58,39,49,229,3,0,1,0,40,168,0,59,39,49,228,3,0,1,1,40,168,0,39,49,228,3,0,1,0,40,168,0,35,1,1,1,49,36,4,0,59,39,49,228,3,0,1,1,40,168,0,57,1,39,49,228,3,0,1,0,59,1,18,0,0,128,63,58,39,49,229,3,0,1,1,40,168,0,40,168,0,40,168,0,57,1,39,49,229,3,0,1,0,59,1,18,0,0,128,63,58,39,49,228,3,0,1,1,40,168,0,40,168,0,40,168,0,1,1,1,221,3,21,233,3,2,42,0,0,0,0,1,35,6,40,248,1,4,20,40,168,0,230,3,2,39,49,231,3,0,2,0,3,39,49,232,3,0,2,0,3,20,40,168,0,230,3,2,39,49,231,3,0,2,1,3,39,49,232,3,0,2,1,3,20,40,168,0,230,3,2,39,49,231,3,0,2,2,3,39,49,232,3,0,2,2,3,1,39,49,231,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,231,3,0,1,3,40,168,0,59,39,49,232,3,0,1,3,40,168,0,40,168,0,1,1,230,3,21,236,3,2,42,0,0,0,0,1,35,20,40,248,1,212,3,2,49,235,3,0,49,234,3,0,1,1,212,3,21,239,3,2,42,0,0,0,0,1,23,0,1,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,81,39,49,237,3,0,1,1,40,14,3,2,42,0,0,0,0,1,35,1,1,20,40,168,0,221,3,2,1,1,39,49,238,3,0,1,0,59,39,49,238,3,0,1,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,39,49,238,3,0,1,1,57,1,1,18,0,0,128,63,58,39,49,238,3,0,1,1,40,168,0,59,39,49,237,3,0,1,0,40,168,0,40,168,0,57,1,39,49,238,3,0,1,0,59,1,1,34,58,39,49,237,3,0,1,1,57,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,57,18,0,0,128,63,40,168,0,40,168,0,40,168,0,1,23,0,1,1,18,0,0,128,64,59,39,49,238,3,0,1,0,40,168,0,81,39,49,238,3,0,1,1,40,14,3,2,42,4,0,46,37,4,9,240,8,40,168,0,2,46,38,4,9,245,8,40,168,0,2,46,39,4,9,250,8,40,168,0,2,46,40,4,9,0,9,40,168,0,2,4,0,245,8,1,0,240,8,0,0,0,9,3,0,250,8,2,0,5,47,37,4,40,168,0,0,1,39,49,238,3,0,1,0,59,39,49,238,3,0,1,0,40,168,0,47,38,4,40,168,0,0,1,49,37,4,0,59,39,49,238,3,0,1,0,40,168,0,47,39,4,40,168,0,0,1,39,49,238,3,0,1,1,59,39,49,238,3,0,1,1,40,168,0,47,40,4,40,168,0,0,1,49,39,4,0,59,39,49,238,3,0,1,1,40,168,0,35,20,40,168,0,221,3,2,1,1,1,1,49,39,4,0,59,1,39,49,237,3,0,1,0,58,1,39,49,238,3,0,1,0,59,1,1,1,18,0,0,64,64,59,39,49,237,3,0,1,1,40,168,0,58,1,18,0,0,192,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,58,18,0,0,128,63,40,168,0,40,168,0,40,168,0,40,168,0,57,1,1,1,18,0,0,64,65,59,39,49,238,3,0,1,1,40,168,0,59,49,37,4,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,40,168,0,58,1,1,18,0,0,128,65,59,49,38,4,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,40,168,0,58,1,49,40,4,0,59,39,49,237,3,0,1,0,40,168,0,40,168,0,49,39,4,0,1,2,42,0,0,0,0,1,35,1,1,1,1,39,49,238,3,0,1,0,59,1,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,57,18,0,0,128,63,40,168,0,40,168,0,57,39,49,237,3,0,1,0,40,168,0,58,1,20,40,168,0,108,0,1,1,39,49,238,3,0,1,1,59,39,49,238,3,0,1,0,40,168,0,59,1,39,49,237,3,0,1,1,58,1,18,0,0,0,64,59,39,49,237,3,0,1,0,40,168,0,40,168,0,40,168,0,40,168,0,58,1,39,49,238,3,0,1,1,59,39,49,237,3,0,1,0,40,168,0,40,168,0,1,1,1,221,3,21,242,3,2,42,0,0,0,0,1,35,44,1,39,49,241,3,0,1,3,76,18,0,0,0,0,40,14,3,49,240,3,0,6,40,248,1,4,20,40,168,0,239,3,2,39,49,240,3,0,2,0,3,39,49,241,3,0,2,0,3,20,40,168,0,239,3,2,39,49,240,3,0,2,1,3,39,49,241,3,0,2,1,3,20,40,168,0,239,3,2,39,49,240,3,0,2,2,3,39,49,241,3,0,2,2,3,1,39,49,240,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,240,3,0,1,3,40,168,0,59,39,49,241,3,0,1,3,40,168,0,40,168,0,1,1,239,3,21,245,3,2,42,0,0,0,0,1,35,6,40,248,1,2,1,1,39,49,243,3,0,3,0,1,2,57,39,49,244,3,0,3,0,1,2,40,154,1,58,1,18,0,0,0,64,59,20,40,154,1,192,0,2,1,39,49,243,3,0,3,0,1,2,59,39,49,244,3,0,1,3,40,154,1,1,39,49,244,3,0,3,0,1,2,59,39,49,243,3,0,1,3,40,154,1,40,154,1,40,154,1,1,39,49,243,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,243,3,0,1,3,40,168,0,59,39,49,244,3,0,1,3,40,168,0,40,168,0,1,0,21,248,3,2,42,0,0,0,0,1,35,6,40,248,1,2,1,1,39,49,247,3,0,3,0,1,2,57,39,49,246,3,0,3,0,1,2,40,154,1,58,1,1,18,0,0,0,64,59,39,49,247,3,0,3,0,1,2,40,154,1,59,39,49,246,3,0,3,0,1,2,40,154,1,40,154,1,1,39,49,246,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,246,3,0,1,3,40,168,0,59,39,49,247,3,0,1,3,40,168,0,40,168,0,1,0,21,251,3,2,42,0,0,0,0,1,35,6,40,248,1,2,1,1,1,1,18,0,0,128,63,58,39,49,249,3,0,1,3,40,168,0,59,39,49,250,3,0,3,0,1,2,40,154,1,57,1,1,18,0,0,128,63,58,39,49,250,3,0,1,3,40,168,0,59,39,49,249,3,0,3,0,1,2,40,154,1,40,154,1,57,1,39,49,249,3,0,3,0,1,2,59,39,49,250,3,0,3,0,1,2,40,154,1,40,154,1,1,39,49,249,3,0,1,3,57,1,1,18,0,0,128,63,58,39,49,249,3,0,1,3,40,168,0,59,39,49,250,3,0,1,3,40,168,0,40,168,0,1,0,21,253,3,2,42,0,0,0,0,1,35,20,40,168,0,148,1,2,6,40,154,1,3,18,154,153,153,62,18,61,10,23,63,18,174,71,225,61,49,252,3,0,1,0,21,1,4,2,42,4,0,46,41,4,9,6,9,40,168,0,2,46,42,4,9,175,8,40,154,1,2,46,43,4,9,10,9,40,168,0,2,46,44,4,9,18,9,40,168,0,2,4,0,6,9,0,0,18,9,3,0,10,9,2,0,175,8,1,0,6,47,41,4,40,168,0,0,20,40,168,0,253,3,1,49,0,4,0,47,42,4,40,154,1,0,1,1,49,41,4,0,58,20,40,168,0,253,3,1,49,254,3,0,40,168,0,57,49,254,3,0,40,154,1,47,43,4,40,168,0,0,20,40,168,0,192,0,2,20,40,168,0,192,0,2,39,49,42,4,0,1,0,39,49,42,4,0,1,1,39,49,42,4,0,1,2,47,44,4,40,168,0,0,20,40,168,0,216,0,2,20,40,168,0,216,0,2,39,49,42,4,0,1,0,39,49,42,4,0,1,1,39,49,42,4,0,1,2,23,0,1,1,49,43,4,0,79,18,0,0,0,0,40,14,3,70,1,49,41,4,0,77,49,43,4,0,40,14,3,40,14,3,2,42,0,0,0,0,1,15,1,49,42,4,1,75,1,49,41,4,0,57,1,1,1,49,42,4,0,58,49,41,4,0,40,154,1,59,49,41,4,0,40,154,1,60,1,49,41,4,0,58,49,43,4,0,40,168,0,40,154,1,40,154,1,40,154,1,1,50,35,44,1,1,49,44,4,0,78,49,255,3,0,40,14,3,70,1,49,44,4,0,77,49,41,4,0,40,14,3,40,14,3,1,49,41,4,0,57,1,1,1,49,42,4,0,58,49,41,4,0,40,154,1,59,1,49,255,3,0,58,49,41,4,0,40,168,0,40,154,1,60,1,49,44,4,0,58,49,41,4,0,40,168,0,40,154,1,40,154,1,49,42,4,0,1,1,253,3,21,3,4,2,42,0,0,0,0,1,35,1,20,40,168,0,216,0,2,20,40,168,0,216,0,2,39,49,2,4,0,1,0,39,49,2,4,0,1,1,39,49,2,4,0,1,2,58,20,40,168,0,192,0,2,20,40,168,0,192,0,2,39,49,2,4,0,1,0,39,49,2,4,0,1,1,39,49,2,4,0,1,2,40,168,0,1,0,21,6,4,2,42,0,0,0,0,1,35,44,1,39,49,4,4,0,1,0,79,39,49,4,4,0,1,2,40,14,3,6,40,154,1,3,18,0,0,0,0,1,1,49,5,4,0,59,1,39,49,4,4,0,1,1,58,39,49,4,4,0,1,0,40,168,0,40,168,0,60,1,39,49,4,4,0,1,2,58,39,49,4,4,0,1,0,40,168,0,40,168,0,49,5,4,0,6,40,154,1,1,18,0,0,0,0,1,0,21,9,4,2,42,1,0,46,45,4,9,201,7,40,168,0,2,1,0,201,7,0,0,3,47,45,4,40,168,0,0,20,40,168,0,3,4,1,49,8,4,0,23,0,1,39,49,7,4,0,1,0,81,39,49,7,4,0,1,1,40,14,3,2,42,0,0,0,0,1,23,0,1,39,49,7,4,0,1,1,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,0,1,2,75,20,40,154,1,6,4,2,39,49,7,4,0,3,0,1,2,49,45,4,0,40,154,1,1,23,0,1,39,49,7,4,0,1,0,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,0,2,1,75,20,40,154,1,6,4,2,39,49,7,4,0,3,0,2,1,49,45,4,0,40,154,1,1,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,2,0,1,75,20,40,154,1,6,4,2,39,49,7,4,0,3,2,0,1,49,45,4,0,40,154,1,1,1,23,0,1,39,49,7,4,0,1,0,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,1,0,2,75,20,40,154,1,6,4,2,39,49,7,4,0,3,1,0,2,49,45,4,0,40,154,1,1,23,0,1,39,49,7,4,0,1,1,81,39,49,7,4,0,1,2,40,14,3,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,1,2,0,75,20,40,154,1,6,4,2,39,49,7,4,0,3,1,2,0,49,45,4,0,40,154,1,1,2,42,0,0,0,0,1,15,1,39,49,7,4,1,3,2,1,0,75,20,40,154,1,6,4,2,39,49,7,4,0,3,2,1,0,49,45,4,0,40,154,1,1,35,49,7,4,0,1,2,3,4,6,4,21,12,4,2,42,3,0,46,46,4,9,125,7,40,168,0,2,46,47,4,9,26,9,40,154,1,2,46,48,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,47,46,4,40,168,0,0,1,39,49,11,4,0,1,3,59,39,49,10,4,0,1,3,40,168,0,47,47,4,40,154,1,0,1,39,49,10,4,0,3,0,1,2,59,39,49,11,4,0,1,3,40,154,1,47,48,4,40,154,1,0,1,39,49,11,4,0,3,0,1,2,59,39,49,10,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,20,40,154,1,9,4,2,49,47,4,0,49,48,4,0,49,46,4,0,49,48,4,0,57,39,49,11,4,0,3,0,1,2,40,154,1,58,49,48,4,0,40,154,1,57,39,49,10,4,0,3,0,1,2,40,154,1,58,49,47,4,0,40,154,1,1,1,39,49,10,4,0,1,3,57,39,49,11,4,0,1,3,40,168,0,58,49,46,4,0,40,168,0,1,2,1,4,9,4,21,15,4,2,42,3,0,46,49,4,9,125,7,40,168,0,2,46,50,4,9,26,9,40,154,1,2,46,51,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,47,49,4,40,168,0,0,1,39,49,14,4,0,1,3,59,39,49,13,4,0,1,3,40,168,0,47,50,4,40,154,1,0,1,39,49,13,4,0,3,0,1,2,59,39,49,14,4,0,1,3,40,154,1,47,51,4,40,154,1,0,1,39,49,14,4,0,3,0,1,2,59,39,49,13,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,20,40,154,1,9,4,2,49,51,4,0,49,50,4,0,49,49,4,0,49,51,4,0,57,39,49,14,4,0,3,0,1,2,40,154,1,58,49,51,4,0,40,154,1,57,39,49,13,4,0,3,0,1,2,40,154,1,58,49,50,4,0,40,154,1,1,1,39,49,13,4,0,1,3,57,39,49,14,4,0,1,3,40,168,0,58,49,49,4,0,40,168,0,1,2,1,4,9,4,21,18,4,2,42,3,0,46,52,4,9,125,7,40,168,0,2,46,53,4,9,26,9,40,154,1,2,46,54,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,47,52,4,40,168,0,0,1,39,49,17,4,0,1,3,59,39,49,16,4,0,1,3,40,168,0,47,53,4,40,154,1,0,1,39,49,16,4,0,3,0,1,2,59,39,49,17,4,0,1,3,40,154,1,47,54,4,40,154,1,0,1,39,49,17,4,0,3,0,1,2,59,39,49,16,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,49,53,4,0,49,52,4,0,49,54,4,0,57,39,49,17,4,0,3,0,1,2,40,154,1,58,49,54,4,0,40,154,1,57,39,49,16,4,0,3,0,1,2,40,154,1,58,49,53,4,0,40,154,1,1,1,39,49,16,4,0,1,3,57,39,49,17,4,0,1,3,40,168,0,58,49,52,4,0,40,168,0,1,1,1,4,21,21,4,2,42,3,0,46,55,4,9,125,7,40,168,0,2,46,56,4,9,26,9,40,154,1,2,46,57,4,9,30,9,40,154,1,2,3,0,125,7,0,0,30,9,2,0,26,9,1,0,4,47,55,4,40,168,0,0,1,39,49,20,4,0,1,3,59,39,49,19,4,0,1,3,40,168,0,47,56,4,40,154,1,0,1,39,49,19,4,0,3,0,1,2,59,39,49,20,4,0,1,3,40,154,1,47,57,4,40,154,1,0,1,39,49,20,4,0,3,0,1,2,59,39,49,19,4,0,1,3,40,154,1,35,6,40,248,1,2,1,1,1,1,20,40,154,1,1,4,3,49,57,4,0,49,55,4,0,49,56,4,0,57,39,49,20,4,0,3,0,1,2,40,154,1,58,49,57,4,0,40,154,1,57,39,49,19,4,0,3,0,1,2,40,154,1,58,49,56,4,0,40,154,1,1,1,39,49,19,4,0,1,3,57,39,49,20,4,0,1,3,40,168,0,58,49,55,4,0,40,168,0,1,1,1,4,13,2,0,42,29,0,46,58,4,29,8,1,34,9,40,1,0,0,46,59,4,29,8,1,41,9,40,1,0,0,46,60,4,29,8,1,46,9,40,1,0,0,46,61,4,29,8,1,51,9,40,1,0,0,46,62,4,29,8,1,60,9,40,1,0,0,46,63,4,29,8,1,69,9,40,1,0,0,46,64,4,29,8,1,76,9,40,1,0,0,46,65,4,29,8,1,83,9,40,1,0,0,46,66,4,29,8,1,91,9,40,1,0,0,46,67,4,29,8,1,99,9,40,1,0,0,46,68,4,29,8,1,108,9,40,1,0,0,46,69,4,29,8,1,117,9,40,1,0,0,46,70,4,29,8,1,122,9,40,1,0,0,46,71,4,29,8,1,128,9,40,1,0,0,46,72,4,29,8,1,138,9,40,1,0,0,46,73,4,29,8,1,146,9,40,1,0,0,46,74,4,29,8,1,155,9,40,1,0,0,46,75,4,29,8,1,163,9,40,1,0,0,46,76,4,29,8,1,172,9,40,1,0,0,46,77,4,29,8,1,184,9,40,1,0,0,46,78,4,29,8,1,195,9,40,1,0,0,46,79,4,29,8,1,206,9,40,1,0,0,46,80,4,29,8,1,217,9,40,1,0,0,46,81,4,29,8,1,229,9,40,1,0,0,46,82,4,29,8,1,240,9,40,1,0,0,46,83,4,29,8,1,250,9,40,1,0,0,46,84,4,29,8,1,255,9,40,1,0,0,46,85,4,29,8,1,11,10,40,1,0,0,46,86,4,29,8,1,18,10,40,1,0,0,29,0,34,9,0,0,11,10,27,0,184,9,19,0,172,9,18,0,155,9,16,0,217,9,22,0,46,9,2,0,108,9,10,0,76,9,6,0,91,9,8,0,60,9,4,0,229,9,23,0,195,9,20,0,250,9,25,0,163,9,17,0,18,10,28,0,128,9,13,0,240,9,24,0,146,9,15,0,122,9,12,0,255,9,26,0,138,9,14,0,206,9,21,0,41,9,1,0,99,9,9,0,69,9,5,0,83,9,7,0,51,9,3,0,117,9,11,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,21,25,4,2,42,0,0,0,0,2,38,0,42,0,0,0,0,49,22,4,0,29,27,0,0,0,0,1,35,20,40,248,1,164,3,2,49,23,4,0,49,24,4,0,27,1,0,0,0,1,35,20,40,248,1,167,3,2,49,23,4,0,49,24,4,0,27,2,0,0,0,1,35,20,40,248,1,170,3,2,49,23,4,0,49,24,4,0,27,3,0,0,0,1,35,20,40,248,1,173,3,2,49,23,4,0,49,24,4,0,27,4,0,0,0,1,35,20,40,248,1,176,3,2,49,23,4,0,49,24,4,0,27,5,0,0,0,1,35,20,40,248,1,179,3,2,49,23,4,0,49,24,4,0,27,6,0,0,0,1,35,20,40,248,1,182,3,2,49,23,4,0,49,24,4,0,27,7,0,0,0,1,35,20,40,248,1,185,3,2,49,23,4,0,49,24,4,0,27,8,0,0,0,1,35,20,40,248,1,188,3,2,49,23,4,0,49,24,4,0,27,9,0,0,0,1,35,20,40,248,1,191,3,2,49,23,4,0,49,24,4,0,27,10,0,0,0,1,35,20,40,248,1,194,3,2,49,23,4,0,49,24,4,0,27,11,0,0,0,1,35,20,40,248,1,197,3,2,49,23,4,0,49,24,4,0,27,12,0,0,0,1,35,20,40,248,1,200,3,2,49,23,4,0,49,24,4,0,27,13,0,0,0,1,35,20,40,248,1,203,3,2,49,23,4,0,49,24,4,0,27,14,0,0,0,1,35,20,40,248,1,206,3,2,49,23,4,0,49,24,4,0,27,15,0,0,0,1,35,20,40,248,1,212,3,2,49,23,4,0,49,24,4,0,27,16,0,0,0,1,35,20,40,248,1,215,3,2,49,23,4,0,49,24,4,0,27,17,0,0,0,1,35,20,40,248,1,218,3,2,49,23,4,0,49,24,4,0,27,18,0,0,0,1,35,20,40,248,1,227,3,2,49,23,4,0,49,24,4,0,27,19,0,0,0,1,35,20,40,248,1,233,3,2,49,23,4,0,49,24,4,0,27,20,0,0,0,1,35,20,40,248,1,236,3,2,49,23,4,0,49,24,4,0,27,21,0,0,0,1,35,20,40,248,1,242,3,2,49,23,4,0,49,24,4,0,27,22,0,0,0,1,35,20,40,248,1,245,3,2,49,23,4,0,49,24,4,0,27,23,0,0,0,1,35,20,40,248,1,248,3,2,49,23,4,0,49,24,4,0,27,24,0,0,0,1,35,20,40,248,1,251,3,2,49,23,4,0,49,24,4,0,27,25,0,0,0,1,35,20,40,248,1,12,4,2,49,23,4,0,49,24,4,0,27,26,0,0,0,1,35,20,40,248,1,15,4,2,49,23,4,0,49,24,4,0,27,27,0,0,0,1,35,20,40,248,1,18,4,2,49,23,4,0,49,24,4,0,27,28,0,0,0,1,35,20,40,248,1,21,4,2,49,23,4,0,49,24,4,0,35,6,40,248,1,1,18,0,0,0,0,1,29,164,3,167,3,170,3,173,3,176,3,179,3,182,3,185,3,188,3,191,3,194,3,197,3,200,3,203,3,206,3,212,3,215,3,218,3,227,3,233,3,236,3,242,3,245,3,248,3,251,3,12,4,15,4,18,4,21,4,21,27,4,2,42,0,0,0,0,1,35,6,40,248,1,2,1,39,49,26,4,0,3,0,1,2,60,20,40,168,0,216,0,2,39,49,26,4,0,1,3,18,23,183,209,56,40,154,1,39,49,26,4,0,1,3,1,0,21,29,4,2,42,0,0,0,0,1,35,6,40,114,1,2,1,39,49,28,4,0,3,0,1,2,60,20,40,160,0,208,0,2,39,49,28,4,0,1,3,18,23,183,209,56,40,150,1,39,49,28,4,0,1,3,1,0,21,31,4,2,42,0,0,0,0,1,35,1,39,49,30,4,0,2,0,1,60,39,49,30,4,0,1,2,40,108,1,1,0,};
diff --git a/src/sksl/generated/sksl_pipeline.dehydrated.sksl b/src/sksl/generated/sksl_pipeline.dehydrated.sksl
index 75c51c7..16cc746 100644
--- a/src/sksl/generated/sksl_pipeline.dehydrated.sksl
+++ b/src/sksl/generated/sksl_pipeline.dehydrated.sksl
@@ -1,2 +1,2 @@
-static constexpr size_t SKSL_INCLUDE_sksl_pipeline_LENGTH = 251;
-static uint8_t SKSL_INCLUDE_sksl_pipeline[251] = {87,0,12,115,107,95,70,114,97,103,67,111,111,114,100,6,102,108,111,97,116,52,2,102,112,17,102,114,97,103,109,101,110,116,80,114,111,99,101,115,115,111,114,6,115,97,109,112,108,101,5,104,97,108,102,52,6,99,111,111,114,100,115,6,102,108,111,97,116,50,9,116,114,97,110,115,102,111,114,109,8,102,108,111,97,116,51,120,51,42,11,0,46,1,0,29,5,15,0,0,2,0,43,2,0,15,0,0,46,3,0,9,22,0,43,4,0,25,0,3,22,5,0,9,43,0,1,3,0,43,6,0,50,0,46,7,0,9,22,0,40,4,0,3,46,8,0,9,56,0,43,9,0,63,0,3,45,10,0,2,40,5,0,22,11,0,9,43,0,2,7,0,8,0,40,6,0,40,11,0,46,12,0,9,22,0,40,4,0,3,46,13,0,9,70,0,43,14,0,80,0,3,45,15,0,3,40,5,0,40,11,0,22,16,0,9,43,0,2,12,0,13,0,40,6,0,40,16,0,2,0,43,0,9,0,2,0,0,0,12,1,48,40,2,0,1,47,1,0,0,50,};
+static constexpr size_t SKSL_INCLUDE_sksl_pipeline_LENGTH = 250;
+static uint8_t SKSL_INCLUDE_sksl_pipeline[250] = {87,0,12,115,107,95,70,114,97,103,67,111,111,114,100,6,102,108,111,97,116,52,2,102,112,17,102,114,97,103,109,101,110,116,80,114,111,99,101,115,115,111,114,6,115,97,109,112,108,101,5,104,97,108,102,52,6,99,111,111,114,100,115,6,102,108,111,97,116,50,9,116,114,97,110,115,102,111,114,109,8,102,108,111,97,116,51,120,51,42,11,0,46,1,0,29,5,15,0,0,2,0,43,2,0,15,0,0,46,3,0,9,22,0,43,4,0,25,0,3,22,5,0,9,43,0,1,3,0,43,6,0,50,0,46,7,0,9,22,0,40,4,0,3,46,8,0,9,56,0,43,9,0,63,0,3,45,10,0,2,40,5,0,22,11,0,9,43,0,2,7,0,8,0,40,6,0,40,11,0,46,12,0,9,22,0,40,4,0,3,46,13,0,9,70,0,43,14,0,80,0,3,45,15,0,3,40,5,0,40,11,0,22,16,0,9,43,0,2,12,0,13,0,40,6,0,40,16,0,2,0,43,0,9,0,2,0,0,0,12,1,48,47,1,0,40,2,0,0,50,};
diff --git a/src/sksl/generated/sksl_vert.dehydrated.sksl b/src/sksl/generated/sksl_vert.dehydrated.sksl
index 369b023..f917e89 100644
--- a/src/sksl/generated/sksl_vert.dehydrated.sksl
+++ b/src/sksl/generated/sksl_vert.dehydrated.sksl
@@ -1,2 +1,2 @@
-static constexpr size_t SKSL_INCLUDE_sksl_vert_LENGTH = 216;
-static uint8_t SKSL_INCLUDE_sksl_vert[216] = {82,0,12,115,107,95,80,101,114,86,101,114,116,101,120,11,115,107,95,80,111,115,105,116,105,111,110,6,102,108,111,97,116,52,12,115,107,95,80,111,105,110,116,83,105,122,101,5,102,108,111,97,116,11,115,107,95,86,101,114,116,101,120,73,68,3,105,110,116,13,115,107,95,73,110,115,116,97,110,99,101,73,68,0,42,6,0,37,1,0,2,0,2,29,5,0,0,0,15,0,43,2,0,27,0,29,5,1,0,0,34,0,43,3,0,47,0,46,4,0,29,8,4,2,0,40,1,0,0,16,4,0,0,16,4,0,1,46,5,0,29,5,42,0,2,53,0,43,6,0,65,0,0,46,7,0,29,5,43,0,2,69,0,40,6,0,0,4,0,69,0,5,0,34,0,3,0,15,0,2,0,53,0,4,0,12,3,26,40,4,0,2,0,83,0,0,48,40,6,0,1,47,5,0,0,50,48,40,6,0,1,47,7,0,0,50,};
+static constexpr size_t SKSL_INCLUDE_sksl_vert_LENGTH = 214;
+static uint8_t SKSL_INCLUDE_sksl_vert[214] = {82,0,12,115,107,95,80,101,114,86,101,114,116,101,120,11,115,107,95,80,111,115,105,116,105,111,110,6,102,108,111,97,116,52,12,115,107,95,80,111,105,110,116,83,105,122,101,5,102,108,111,97,116,11,115,107,95,86,101,114,116,101,120,73,68,3,105,110,116,13,115,107,95,73,110,115,116,97,110,99,101,73,68,0,42,6,0,37,1,0,2,0,2,29,5,0,0,0,15,0,43,2,0,27,0,29,5,1,0,0,34,0,43,3,0,47,0,46,4,0,29,8,4,2,0,40,1,0,0,16,4,0,0,16,4,0,1,46,5,0,29,5,42,0,2,53,0,43,6,0,65,0,0,46,7,0,29,5,43,0,2,69,0,40,6,0,0,4,0,69,0,5,0,34,0,3,0,15,0,2,0,53,0,4,0,12,3,26,40,4,0,2,0,83,0,0,48,47,5,0,40,6,0,0,50,48,47,7,0,40,6,0,0,50,};
diff --git a/src/sksl/ir/SkSLProgramElement.h b/src/sksl/ir/SkSLProgramElement.h
index 826468a..8adcf5e 100644
--- a/src/sksl/ir/SkSLProgramElement.h
+++ b/src/sksl/ir/SkSLProgramElement.h
@@ -25,10 +25,10 @@
kInterfaceBlock,
kModifiers,
kSection,
- kVar,
+ kGlobalVar,
kFirst = kEnum,
- kLast = kVar
+ kLast = kGlobalVar
};
ProgramElement(int offset, Kind kind)
diff --git a/src/sksl/ir/SkSLStatement.h b/src/sksl/ir/SkSLStatement.h
index d7333f4..aa8674e 100644
--- a/src/sksl/ir/SkSLStatement.h
+++ b/src/sksl/ir/SkSLStatement.h
@@ -32,7 +32,6 @@
kSwitch,
kSwitchCase,
kVarDeclaration,
- kVarDeclarations,
kWhile,
kFirst = kBlock,
diff --git a/src/sksl/ir/SkSLVarDeclarations.h b/src/sksl/ir/SkSLVarDeclarations.h
index 475b45d..21883f5 100644
--- a/src/sksl/ir/SkSLVarDeclarations.h
+++ b/src/sksl/ir/SkSLVarDeclarations.h
@@ -16,20 +16,22 @@
namespace SkSL {
/**
- * A single variable declaration within a var declaration statement. For instance, the statement
- * 'int x = 2, y[3];' is a VarDeclarations statement containing two individual VarDeclaration
- * instances.
+ * A single variable declaration statement. Multiple variables declared together are expanded to
+ * separate (sequential) statements. For instance, the SkSL 'int x = 2, y[3];' produces two
+ * VarDeclaration instances (wrapped in an unscoped Block).
*/
struct VarDeclaration : public Statement {
static constexpr Kind kStatementKind = Kind::kVarDeclaration;
VarDeclaration(const Variable* var,
+ const Type* baseType,
std::vector<std::unique_ptr<Expression>> sizes,
std::unique_ptr<Expression> value)
- : INHERITED(var->fOffset, kStatementKind)
- , fVar(var)
- , fSizes(std::move(sizes))
- , fValue(std::move(value)) {}
+ : INHERITED(var->fOffset, kStatementKind)
+ , fVar(var)
+ , fBaseType(*baseType)
+ , fSizes(std::move(sizes))
+ , fValue(std::move(value)) {}
std::unique_ptr<Statement> clone() const override {
std::vector<std::unique_ptr<Expression>> sizesClone;
@@ -40,12 +42,13 @@
sizesClone.push_back(nullptr);
}
}
- return std::unique_ptr<Statement>(new VarDeclaration(fVar, std::move(sizesClone),
- fValue ? fValue->clone() : nullptr));
+ return std::make_unique<VarDeclaration>(fVar, &fBaseType, std::move(sizesClone),
+ fValue ? fValue->clone() : nullptr);
}
String description() const override {
- String result = fVar->fModifiers.description() + fVar->type().name() + " " + fVar->name();
+ String result =
+ fVar->fModifiers.description() + fBaseType.description() + " " + fVar->name();
for (const auto& size : fSizes) {
if (size) {
result += "[" + size->description() + "]";
@@ -56,10 +59,12 @@
if (fValue) {
result += " = " + fValue->description();
}
+ result += ";";
return result;
}
const Variable* fVar;
+ const Type& fBaseType;
std::vector<std::unique_ptr<Expression>> fSizes;
std::unique_ptr<Expression> fValue;
@@ -67,66 +72,28 @@
};
/**
- * A variable declaration statement, which may consist of one or more individual variables.
+ * A variable declaration appearing at global scope. A global declaration like 'int x, y;' produces
+ * two GlobalVarDeclaration elements, each containing the declaration of one variable.
*/
-struct VarDeclarations : public ProgramElement {
- static constexpr Kind kProgramElementKind = Kind::kVar;
+struct GlobalVarDeclaration : public ProgramElement {
+ static constexpr Kind kProgramElementKind = Kind::kGlobalVar;
- // vars must be a vector of unique_ptr<VarDeclaration>, but to simplify the CFG, we store
- // (and thus are constructed with) Statements.
- VarDeclarations(int offset, const Type* baseType, std::vector<std::unique_ptr<Statement>> vars)
- : INHERITED(offset, kProgramElementKind), fBaseType(*baseType)
- , fVars(std::move(vars)) {
-#if defined(SK_DEBUG)
- for (auto& var : fVars) {
- SkASSERT(var->is<VarDeclaration>());
- }
-#endif
+ // decl must be a unique_ptr<VarDeclaration>, but to simplify construction, we take a Statement
+ GlobalVarDeclaration(int offset, std::unique_ptr<Statement> decl)
+ : INHERITED(offset, kProgramElementKind) {
+ SkASSERT(decl->is<VarDeclaration>());
+ fDecl.reset(static_cast<VarDeclaration*>(decl.release()));
}
std::unique_ptr<ProgramElement> clone() const override {
- std::vector<std::unique_ptr<Statement>> cloned;
- cloned.reserve(fVars.size());
- for (const auto& v : fVars) {
- cloned.push_back(v->clone());
- }
- return std::make_unique<VarDeclarations>(fOffset, &fBaseType, std::move(cloned));
+ return std::make_unique<GlobalVarDeclaration>(fOffset, fDecl->clone());
}
String description() const override {
- if (!fVars.size()) {
- return String();
- }
- String result;
- for (const auto& var : fVars) {
- if (var->kind() != Statement::Kind::kNop) {
- SkASSERT(var->kind() == Statement::Kind::kVarDeclaration);
- result = ((const VarDeclaration&) *var).fVar->fModifiers.description();
- break;
- }
- }
- result += fBaseType.description() + " ";
- String separator;
- for (const auto& rawVar : fVars) {
- if (rawVar->kind() == Statement::Kind::kNop) {
- continue;
- }
- SkASSERT(rawVar->kind() == Statement::Kind::kVarDeclaration);
- VarDeclaration& var = (VarDeclaration&) *rawVar;
- result += separator;
- separator = ", ";
- result += var.fVar->name();
- if (var.fValue) {
- result += " = " + var.fValue->description();
- }
- }
- return result;
+ return fDecl->description();
}
- const Type& fBaseType;
- // this *should* be a vector of unique_ptr<VarDeclaration>, but it significantly simplifies the
- // CFG to only have to worry about unique_ptr<Statement>
- std::vector<std::unique_ptr<Statement>> fVars;
+ std::unique_ptr<VarDeclaration> fDecl;
using INHERITED = ProgramElement;
};
diff --git a/src/sksl/ir/SkSLVarDeclarationsStatement.h b/src/sksl/ir/SkSLVarDeclarationsStatement.h
deleted file mode 100644
index a611b58..0000000
--- a/src/sksl/ir/SkSLVarDeclarationsStatement.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SKSL_VARDECLARATIONSSTATEMENT
-#define SKSL_VARDECLARATIONSSTATEMENT
-
-#include "src/sksl/ir/SkSLStatement.h"
-#include "src/sksl/ir/SkSLVarDeclarations.h"
-
-namespace SkSL {
-
-/**
- * One or more variable declarations appearing as a statement within a function.
- */
-struct VarDeclarationsStatement : public Statement {
- static constexpr Kind kStatementKind = Kind::kVarDeclarations;
-
- VarDeclarationsStatement(std::unique_ptr<VarDeclarations> decl)
- : INHERITED(decl->fOffset, kStatementKind)
- , fDeclaration(std::move(decl)) {}
-
- bool isEmpty() const override {
- for (const auto& s : fDeclaration->fVars) {
- if (!s->isEmpty()) {
- return false;
- }
- }
- return true;
- }
-
- std::unique_ptr<Statement> clone() const override {
- std::unique_ptr<VarDeclarations> cloned((VarDeclarations*) fDeclaration->clone().release());
- return std::unique_ptr<Statement>(new VarDeclarationsStatement(std::move(cloned)));
- }
-
- String description() const override {
- return fDeclaration->description() + ";";
- }
-
- std::unique_ptr<VarDeclarations> fDeclaration;
-
- using INHERITED = Statement;
-};
-
-} // namespace SkSL
-
-#endif