Revert "removed SkSLLayoutLexer"

This reverts commit 804f81786148cd3a4385d10ab7a31340fa47b10d.

Reason for revert: breaking chrome roll: https://logs.chromium.org/logs/chromium/buildbucket/cr-buildbucket.appspot.com/8940111858576531488/+/steps/compile__with_patch_/0/stdout

Original change's description:
> removed SkSLLayoutLexer
> 
> Bug: skia:
> Change-Id: Iad4c89fbde8bc1f6c3d022af9aec2ec5faa8a4ef
> Reviewed-on: https://skia-review.googlesource.com/142583
> Reviewed-by: Mike Klein <mtklein@google.com>
> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>

TBR=mtklein@google.com,ethannicholas@google.com

Change-Id: Ie07065ac43c5b8356665a7170adbe97ae8fd9f90
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:
Reviewed-on: https://skia-review.googlesource.com/143120
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/gn/sksl.gni b/gn/sksl.gni
index 5cf376f..bce75c8 100644
--- a/gn/sksl.gni
+++ b/gn/sksl.gni
@@ -16,6 +16,7 @@
   "$_src/sksl/SkSLIRGenerator.cpp",
   "$_src/sksl/SkSLJIT.cpp",
   "$_src/sksl/SkSLLexer.cpp",
+  "$_src/sksl/SkSLLayoutLexer.cpp",
   "$_src/sksl/SkSLMetalCodeGenerator.cpp",
   "$_src/sksl/SkSLParser.cpp",
   "$_src/sksl/SkSLSPIRVCodeGenerator.cpp",
diff --git a/src/sksl/SkSLLayoutLexer.cpp b/src/sksl/SkSLLayoutLexer.cpp
new file mode 100644
index 0000000..58af170
--- /dev/null
+++ b/src/sksl/SkSLLayoutLexer.cpp
@@ -0,0 +1,555 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+/*****************************************************************************************
+ ******************** This file was generated by sksllex. Do not edit. *******************
+ *****************************************************************************************/
+#include "SkSLLayoutLexer.h"
+
+namespace SkSL {
+
+static int16_t mappings[127] = {
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  1,  1, 1, 1, 1,  1,  1,  1,  1,  1,  1,
+        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1, 1, 1,  1,  1,  1,  1,  1,  1,
+        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1, 1, 1,  1,  1,  1,  1,  1,  1,
+        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1, 1, 1,  1,  1,  1,  1,  1,  1,
+        1,  1,  1,  1,  1,  1,  1,  3,  1,  4,  5,  6,  7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 1, 1, 1, 1,  1};
+static int16_t transitions[29][326] = {
+        {
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0,   2, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   14, 0,   0, 0, 0,   0,   0,   0,
+                22,  0, 0,   0, 26, 0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                85,  0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   0,   0,   0,
+                169, 0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   180, 0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   202, 0,  0,   0, 0, 0,   0,   209, 0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 0,   229, 0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  0,   0, 0, 249, 0,   0,   0,
+                0,   0, 255, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0,   0,  267, 0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,   285, 0,   0,  0,   0, 0, 0,   0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 305, 0,   0,   0,  0,   0, 0, 312, 0,   0,   0,
+                0,   0, 0,   0, 0,  0, 0, 0, 0, 0, 0,
+        },
+        {
+                0,   2, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 23, 0, 0,   0, 0,   0, 0,   30,  0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   51,  0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 0,   0,   75, 0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 105, 0, 0,   0, 109, 0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 0,   134, 0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   170, 0,   0, 173, 0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 189, 0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   210, 0,   0, 213, 0,   0,  0,   0, 0, 0, 0,
+                221, 0, 0,  0, 0,   0, 227, 0, 0,   0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 0,   0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 273, 0,   0,  0,   0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   291, 0, 0,   0,   0,  0,   0, 0, 0, 300,
+                0,   0, 0,  0, 0,   0, 0,   0, 0,   0,   0,   0, 313, 0,   0,  316, 0, 0, 0, 0,
+                0,   0, 0,  0, 0,   0,
+        },
+        {
+                0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0,
+        },
+        {
+                0, 156, 0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 36,  0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   63,
+                0, 0,   0, 67,  0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 86,  0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   137, 0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   174, 0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 188, 0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 214, 0,   0,   217, 0, 0, 220, 0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 235, 0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 268, 0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 286, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0,   0, 0,   0,   0,   0,   0, 0, 0,   0,   0, 0,   0, 0, 0,   0, 0, 0, 0,   0,
+                0, 317, 0, 0,   320, 0,   0,   0, 0, 0,   0,
+        },
+        {
+                0,   2,   0, 0, 0,  6, 0, 0, 0, 0, 0, 0, 13, 0, 0,   0, 0,  0, 0,   0, 0, 0, 50, 0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 45, 0, 0,   0, 0, 0, 47, 0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 163, 0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 183, 0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 211, 0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                265, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   0,   0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0,  0, 0,   0, 0, 0, 0,  0,
+                0,   314, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,
+        },
+        {
+                0,   2,   0,   0,   0, 0,   0,   0,  0,   0,   11,  0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 65,  0,   0,  0,   27,  0,   0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   0,   0,   0,   0,  0,   49,  0,   0,
+                0,   0,   54,  0,   0, 0,   0,   59, 0,   61,  0,   0,   64, 0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   0,   0,   0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   93, 0,   0,   0,   0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   0,   0,   0,   0,  0,   0,   0,   119,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   0,   0,   131, 0,  0,   0,   0,   0,
+                0,   0,   139, 140, 0, 0,   0,   0,  0,   0,   0,   0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   160, 0,  0,   0,   164, 0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   177, 0,  0,   0,   0,   0,   0,  184, 0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  196, 0,   0,   0,   0,  201, 0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   0,   215, 0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   231, 0,   0,   0,  0,   236, 0,   0,
+                0,   0,   0,   242, 0, 0,   0,   0,  0,   0,   0,   0,   0,  0,   253, 0,   0,
+                0,   257, 0,   0,   0, 261, 0,   0,  0,   0,   266, 0,   0,  0,   0,   271, 0,
+                0,   0,   275, 0,   0, 0,   0,   0,  0,   0,   0,   0,   0,  0,   0,   0,   0,
+                0,   0,   0,   0,   0, 295, 0,   0,  0,   0,   0,   0,   0,  0,   304, 0,   0,
+                0,   0,   0,   0,   0, 0,   0,   0,  0,   0,   0,   318, 0,  0,   0,   0,   0,
+                324, 0,   0,
+        },
+        {
+                0, 2, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 143, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 239, 240,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0, 0, 0, 0,
+        },
+        {
+                0, 2, 0,   0, 0, 0,   0, 0,  9, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 48,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 80, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 116, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 147, 0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 246, 0, 0,  0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 274, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 302, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0, 0,
+        },
+        {
+                0, 2, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 74, 0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 81, 0, 0,   0, 0, 91, 0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   117, 0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 148, 0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 175, 0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 284, 0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0, 0,  0, 0, 0, 0, 0, 0,   0,   0, 0,  0,
+                0, 0, 0, 0,   0, 0, 0,   0, 0,  0, 323, 0, 0, 0,
+        },
+        {
+                0,   161, 0,   4, 0, 0, 7,   0,   0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   0,   0,   0,   32, 0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   0,   0,   0,   0,  56, 0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   0,   0,   0,   0,  0,  0, 71,  0,
+                0,   0,   0,   0, 0, 0, 79,  0,   0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 97,  0,   0, 0,   101, 0,   0,   0,  0,  0, 0,   0,
+                0,   0,   111, 0, 0, 0, 115, 0,   0, 0,   0,   0,   0,   0,  0,  0, 125, 0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                0,   146, 0,   0, 0, 0, 151, 0,   0, 154, 0,   0,   0,   0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                181, 0,   0,   0, 0, 0, 0,   0,   0, 0,   191, 0,   0,   0,  0,  0, 0,   0,
+                199, 0,   0,   0, 0, 0, 0,   206, 0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 223, 0,   0, 0,   0,   0,   0,   0,  0,  0, 0,   234,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   245, 0,   247, 0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   0,   264, 0,   0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   278, 0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                0,   0,   0,   0, 0, 0, 0,   0,   0, 0,   299, 0,   0,   0,  0,  0, 0,   0,
+                0,   0,   309, 0, 0, 0, 0,   0,   0, 0,   0,   0,   0,   0,  0,  0, 0,   0,
+                0,   0,
+        },
+        {
+                0, 2, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 315, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0,  195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                53, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0,  0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0,   198, 0,  10, 0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                114, 24,  25, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 38, 0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   68,  0,  0,  0, 0, 0, 0, 0, 0, 0, 78, 0,   0,   0, 0,  0,   84, 0, 94,  0, 88,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  123, 0,   0, 0,  127, 0,  0, 0,   0, 0,
+                133, 0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  145, 0,   0, 0,  0,   0,  0, 152, 0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   256, 0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  303, 0,  0, 0,   0, 0,
+                0,   0,   0,  0,  0, 0, 0, 0, 0, 0, 0, 0,  0,   0,   0, 0,  0,   0,
+        },
+        {
+                0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 121, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 176, 0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,   0, 0, 0,   0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0,   2,   0, 0,  5,   0, 0, 8,   0, 0, 0, 12,  0,   0,  0,   0,   0, 0,   0,   0,
+                0,   0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   34, 0,   0,   0, 0,   0,   0,
+                0,   0,   0, 44, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  55,  0,   0, 0,   0,   0,
+                0,   62,  0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   73,  0,  0,   0,   0, 0,   0,   0,
+                0,   0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   0,   0, 98,  0,   0,
+                0,   0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   113, 0,  0,   0,   0, 0,   0,   120,
+                0,   0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   0,   0, 0,   0,   0,
+                141, 0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  155, 0,   0, 0,   0,   0,
+                0,   162, 0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   0,   0, 178, 0,   0,
+                0,   182, 0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   193, 0,  0,   0,   0, 0,   0,   200,
+                0,   0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   216, 0, 0,   0,   0,
+                0,   0,   0, 0,  225, 0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   0,   0, 0,   0,   0,
+                0,   0,   0, 0,  0,   0, 0, 248, 0, 0, 0, 0,   0,   0,  0,   0,   0, 0,   0,   0,
+                0,   0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   0,   0, 0,   279, 0,
+                0,   0,   0, 0,  0,   0, 0, 288, 0, 0, 0, 292, 0,   0,  0,   0,   0, 0,   0,   0,
+                301, 0,   0, 0,  0,   0, 0, 0,   0, 0, 0, 0,   0,   0,  0,   0,   0, 0,   319, 0,
+                0,   0,   0, 0,  325, 0,
+        },
+        {
+                0,   238, 0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 19, 0, 0,  0,
+                129, 0,   0, 0,   0,   0,  0, 0, 0, 0, 33,  0, 0,   0, 37, 0,   39, 0, 0,  0, 0,  0,
+                0,   46,  0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   0,   72, 0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 87, 0,
+                89,  0,   0, 0,   0,   0,  0, 0, 0, 0, 99,  0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   112, 0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   142, 0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   0,   0,  0, 0, 0, 0, 187, 0, 0,   0, 0,  192, 0,  0, 0,  0, 0,  0,
+                219, 0,   0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 224, 0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   269, 0,  0, 0, 0, 0, 0,   0, 277, 0, 0,  0,   0,  0, 0,  0, 0,  0,
+                287, 0,   0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0, 0,  0, 0,  0,
+                0,   0,   0, 0,   0,   0,  0, 0, 0, 0, 0,   0, 0,   0, 0,  0,   0,  0,
+        },
+        {
+                0, 276, 0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   17, 18, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 126, 0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 159, 0, 0, 0, 166, 0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 207, 0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 251, 252, 0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,  0, 0, 0, 0,
+                0, 310, 0, 0, 0,   0, 0, 0, 0,   0,   0, 0, 0, 0, 0, 0,   0,  0,
+        },
+        {
+                0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0, 2,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   20,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   40,
+                0, 0,   43,  0, 0,   0, 0, 0,   0, 0,  0, 52,  0, 0,   0, 0,  0, 0,   0,   60,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 76, 0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 90, 0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 108, 0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 132, 0, 0,   0, 0,  0, 138, 0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 205, 0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 232, 0, 0,   0, 0,  0, 0,   244, 0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 254, 0, 0,  0, 0,   0,   0,
+                0, 262, 263, 0, 0,   0, 0, 0,   0, 0,  0, 272, 0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0, 0, 0,   0, 0,  0, 0,   0, 0,   0, 0,  0, 298, 0,   0,
+                0, 0,   0,   0, 0,   0, 0, 308, 0, 0,  0, 0,   0, 0,   0, 0,  0, 0,   0,   0,
+                0, 0,   0,   0, 0,   0,
+        },
+        {
+                0, 294, 0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   15, 0,   0, 0, 0, 0, 0,
+                0, 136, 0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   35,  0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   70, 0,   0, 0,   0,   83,  0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 104, 0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  100, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 194, 0,   0,  0,   0, 0,   0,   0,   208, 203, 0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   237, 0,  0,   0, 241, 0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,   0,   0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  281, 0, 283, 0,   0,   0,   0,   0,  289, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   311, 306, 0,   0,   0,  0,   0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0,   0,   0,  0,   0, 0,   0,
+        },
+        {
+                0,   297, 0,  0, 0,   0,   0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   21, 0, 0,   0,   0,   0,   0,   0,   0, 0,   31,  0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   82,  0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   0,   0, 102, 0,   0, 0, 106, 0,   0,
+                0,   110, 0,  0, 0,   0,   0,   0,   0,   118, 0, 0,   0,   0, 0, 124, 0,   0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   144,
+                0,   0,   0,  0, 149, 0,   0,   0,   153, 0,   0, 0,   157, 0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   168, 0,   0,   171, 172, 0, 0,   0,   0, 0, 0,   179, 0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   190, 0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   204, 0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   222, 0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   233, 0,
+                0,   0,   0,  0, 0,   0,   0,   0,   243, 0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   0,   259, 0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,   0,  0, 0,   0,   0,   0,   0,   280, 0, 0,   0,   0, 0, 0,   0,   0,
+                0,   290, 0,  0, 293, 0,   0,   296, 0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                307, 0,   0,  0, 0,   0,   0,   0,   0,   0,   0, 0,   0,   0, 0, 0,   0,   0,
+                0,   0,
+        },
+        {
+                0, 2, 0,  150, 0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 16, 0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 29, 0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   42, 0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 69, 0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  92,  0, 0, 95, 0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 107, 0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 122, 0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   167, 0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  250, 0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   282, 0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0, 0,   0,  0, 0,
+                0, 0, 0,  0,   0, 0, 0,  0,   0, 0, 0, 0,   0,   0, 0, 0,  0, 0,
+        },
+        {
+                0, 2, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 130, 0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 186, 0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 230, 0, 0, 0, 0, 0,   0, 0, 0, 260, 0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 270, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0, 0,   0, 0, 0, 0,   0,
+                0, 0, 0, 0, 0, 0,   0, 0, 0, 0,   0, 0, 0, 0,
+        },
+        {
+                0, 322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        },
+        {
+                0, 2, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 185, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
+                0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0,
+        },
+        {
+                0, 2, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 103, 0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 128, 0, 0,   0,   0,
+                0, 0, 135, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   158, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   197, 0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 218, 0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0, 0, 0,   0, 0,   0,   0,
+                0, 0, 0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 321, 0, 0,   0, 0, 0,
+        },
+};
+
+static int8_t accepts[326] = {
+        -1, -1, 39, 39, -1, -1, -1, -1, -1, 3,  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1, -1, -1, -1, -1,
+        17, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1,
+        -1, -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1,
+        -1, -1, 24, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, -1,
+        -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1,
+        -1, -1, -1, 13, -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1,
+        -1, 6,  39, -1, -1, -1, 38, 39, -1, -1, -1, 4,  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+        -1, -1, -1, -1, -1, -1, -1, -1, -1, 7,  -1, -1, -1, -1, -1, -1, -1, -1, 35, 39, -1, 37,
+        39, -1, -1, -1, -1, -1, -1, -1, -1, 29, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, -1,
+        -1, -1, -1, -1, -1, 1,  39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, 39, -1, -1, -1,
+        -1, 2,  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8,  -1, -1, -1, -1,
+        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9,  39, -1, -1, -1, -1, 27, -1, -1, -1, -1,
+        -1, -1, -1, -1, -1, -1, -1, 26, 39, -1, 5,  39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+        -1, -1, 32, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 39, -1, -1, 36,
+};
+
+LayoutToken LayoutLexer::next() {
+    int startOffset = fOffset;
+    if (startOffset == fLength) {
+        return LayoutToken(LayoutToken::END_OF_FILE, startOffset, 0);
+    }
+    int offset = startOffset;
+    int state = 1;
+    LayoutToken::Kind lastAccept = LayoutToken::Kind::INVALID;
+    int lastAcceptEnd = startOffset + 1;
+    while (offset < fLength) {
+        if ((uint8_t)fText[offset] >= 127) {
+            break;
+        }
+        state = transitions[mappings[(int)fText[offset]]][state];
+        ++offset;
+        if (!state) {
+            break;
+        }
+        // We seem to be getting away without doing this check.
+        /*if (accepts[state] != -1)*/ {
+            lastAccept = (LayoutToken::Kind)accepts[state];
+            lastAcceptEnd = offset;
+        }
+    }
+    fOffset = lastAcceptEnd;
+    return LayoutToken(lastAccept, startOffset, lastAcceptEnd - startOffset);
+}
+
+}  // namespace SkSL
diff --git a/src/sksl/SkSLLayoutLexer.h b/src/sksl/SkSLLayoutLexer.h
new file mode 100644
index 0000000..e95f20e
--- /dev/null
+++ b/src/sksl/SkSLLayoutLexer.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+/*****************************************************************************************
+ ******************** This file was generated by sksllex. Do not edit. *******************
+ *****************************************************************************************/
+#ifndef SKSL_LayoutLexer
+#define SKSL_LayoutLexer
+#include <cstddef>
+#include <cstdint>
+namespace SkSL {
+
+struct LayoutToken {
+    enum Kind {
+#undef END_OF_FILE
+        END_OF_FILE,
+#undef LOCATION
+        LOCATION,
+#undef OFFSET
+        OFFSET,
+#undef BINDING
+        BINDING,
+#undef INDEX
+        INDEX,
+#undef SET
+        SET,
+#undef BUILTIN
+        BUILTIN,
+#undef INPUT_ATTACHMENT_INDEX
+        INPUT_ATTACHMENT_INDEX,
+#undef ORIGIN_UPPER_LEFT
+        ORIGIN_UPPER_LEFT,
+#undef OVERRIDE_COVERAGE
+        OVERRIDE_COVERAGE,
+#undef BLEND_SUPPORT_ALL_EQUATIONS
+        BLEND_SUPPORT_ALL_EQUATIONS,
+#undef BLEND_SUPPORT_MULTIPLY
+        BLEND_SUPPORT_MULTIPLY,
+#undef BLEND_SUPPORT_SCREEN
+        BLEND_SUPPORT_SCREEN,
+#undef BLEND_SUPPORT_OVERLAY
+        BLEND_SUPPORT_OVERLAY,
+#undef BLEND_SUPPORT_DARKEN
+        BLEND_SUPPORT_DARKEN,
+#undef BLEND_SUPPORT_LIGHTEN
+        BLEND_SUPPORT_LIGHTEN,
+#undef BLEND_SUPPORT_COLORDODGE
+        BLEND_SUPPORT_COLORDODGE,
+#undef BLEND_SUPPORT_COLORBURN
+        BLEND_SUPPORT_COLORBURN,
+#undef BLEND_SUPPORT_HARDLIGHT
+        BLEND_SUPPORT_HARDLIGHT,
+#undef BLEND_SUPPORT_SOFTLIGHT
+        BLEND_SUPPORT_SOFTLIGHT,
+#undef BLEND_SUPPORT_DIFFERENCE
+        BLEND_SUPPORT_DIFFERENCE,
+#undef BLEND_SUPPORT_EXCLUSION
+        BLEND_SUPPORT_EXCLUSION,
+#undef BLEND_SUPPORT_HSL_HUE
+        BLEND_SUPPORT_HSL_HUE,
+#undef BLEND_SUPPORT_HSL_SATURATION
+        BLEND_SUPPORT_HSL_SATURATION,
+#undef BLEND_SUPPORT_HSL_COLOR
+        BLEND_SUPPORT_HSL_COLOR,
+#undef BLEND_SUPPORT_HSL_LUMINOSITY
+        BLEND_SUPPORT_HSL_LUMINOSITY,
+#undef PUSH_CONSTANT
+        PUSH_CONSTANT,
+#undef POINTS
+        POINTS,
+#undef LINES
+        LINES,
+#undef LINE_STRIP
+        LINE_STRIP,
+#undef LINES_ADJACENCY
+        LINES_ADJACENCY,
+#undef TRIANGLES
+        TRIANGLES,
+#undef TRIANGLE_STRIP
+        TRIANGLE_STRIP,
+#undef TRIANGLES_ADJACENCY
+        TRIANGLES_ADJACENCY,
+#undef MAX_VERTICES
+        MAX_VERTICES,
+#undef INVOCATIONS
+        INVOCATIONS,
+#undef WHEN
+        WHEN,
+#undef KEY
+        KEY,
+#undef CTYPE
+        CTYPE,
+#undef INVALID
+        INVALID,
+    };
+
+    LayoutToken() : fKind(Kind::INVALID), fOffset(-1), fLength(-1) {}
+
+    LayoutToken(Kind kind, int offset, int length)
+            : fKind(kind), fOffset(offset), fLength(length) {}
+
+    Kind fKind;
+    int fOffset;
+    int fLength;
+};
+
+class LayoutLexer {
+public:
+    void start(const char* text, size_t length) {
+        fText = text;
+        fLength = length;
+        fOffset = 0;
+    }
+
+    LayoutToken next();
+
+private:
+    const char* fText;
+    int fLength;
+    int fOffset;
+};
+
+}  // namespace SkSL
+#endif
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index bdff116..46dce11 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -46,10 +46,6 @@
 #include "ir/SkSLModifiers.h"
 #include "ir/SkSLType.h"
 
-#ifndef SKSL_STANDALONE
-#include "SkOnce.h"
-#endif
-
 namespace SkSL {
 
 #define MAX_PARSE_DEPTH 50
@@ -77,63 +73,12 @@
     Parser* fParser;
 };
 
-std::unordered_map<String, Parser::LayoutToken> Parser::layoutTokens;
-
-void Parser::InitLayoutMap() {
-    #define TOKEN(name, text) layoutTokens[text] = LayoutToken::name;
-    TOKEN(LOCATION,                     "location");
-    TOKEN(OFFSET,                       "offset");
-    TOKEN(BINDING,                      "binding");
-    TOKEN(INDEX,                        "index");
-    TOKEN(SET,                          "set");
-    TOKEN(BUILTIN,                      "builtin");
-    TOKEN(INPUT_ATTACHMENT_INDEX,       "input_attachment_index");
-    TOKEN(ORIGIN_UPPER_LEFT,            "origin_upper_left");
-    TOKEN(OVERRIDE_COVERAGE,            "override_coverage");
-    TOKEN(BLEND_SUPPORT_ALL_EQUATIONS,  "blend_support_all_equations");
-    TOKEN(BLEND_SUPPORT_MULTIPLY,       "blend_support_multiply");
-    TOKEN(BLEND_SUPPORT_SCREEN,         "blend_support_screen");
-    TOKEN(BLEND_SUPPORT_OVERLAY,        "blend_support_overlay");
-    TOKEN(BLEND_SUPPORT_DARKEN,         "blend_support_darken");
-    TOKEN(BLEND_SUPPORT_LIGHTEN,        "blend_support_lighten");
-    TOKEN(BLEND_SUPPORT_COLORDODGE,     "blend_support_colordodge");
-    TOKEN(BLEND_SUPPORT_COLORBURN,      "blend_support_colorburn");
-    TOKEN(BLEND_SUPPORT_HARDLIGHT,      "blend_support_hardlight");
-    TOKEN(BLEND_SUPPORT_SOFTLIGHT,      "blend_support_softlight");
-    TOKEN(BLEND_SUPPORT_DIFFERENCE,     "blend_support_difference");
-    TOKEN(BLEND_SUPPORT_EXCLUSION,      "blend_support_exclusion");
-    TOKEN(BLEND_SUPPORT_HSL_HUE,        "blend_support_hsl_hue");
-    TOKEN(BLEND_SUPPORT_HSL_SATURATION, "blend_support_hsl_saturation");
-    TOKEN(BLEND_SUPPORT_HSL_COLOR,      "blend_support_hsl_color");
-    TOKEN(BLEND_SUPPORT_HSL_LUMINOSITY, "blend_support_hsl_luminosity");
-    TOKEN(PUSH_CONSTANT,                "push_constant");
-    TOKEN(POINTS,                       "points");
-    TOKEN(LINES,                        "lines");
-    TOKEN(LINE_STRIP,                   "line_strip");
-    TOKEN(LINES_ADJACENCY,              "lines_adjacency");
-    TOKEN(TRIANGLES,                    "triangles");
-    TOKEN(TRIANGLE_STRIP,               "triangle_strip");
-    TOKEN(TRIANGLES_ADJACENCY,          "triangles_adjacency");
-    TOKEN(MAX_VERTICES,                 "max_vertices");
-    TOKEN(INVOCATIONS,                  "invocations");
-    TOKEN(WHEN,                         "when");
-    TOKEN(KEY,                          "key");
-    TOKEN(CTYPE,                        "ctype");
-    #undef TOKEN
-}
-
 Parser::Parser(const char* text, size_t length, SymbolTable& types, ErrorReporter& errors)
 : fText(text)
 , fPushback(Token::INVALID, -1, -1)
 , fTypes(types)
 , fErrors(errors) {
     fLexer.start(text, length);
-#ifdef SKSL_STANDALONE
-    InitLayoutMap();
-#else
-    static SkOnce once;
-    once([] { InitLayoutMap(); });
-#endif
 }
 
 /* (directive | section | declaration)* END_OF_FILE */
@@ -745,9 +690,10 @@
         for (;;) {
             Token t = this->nextToken();
             String text = this->text(t);
-            auto found = layoutTokens.find(text);
-            if (found != layoutTokens.end()) {
-                switch (found->second) {
+            fLayoutLexer.start(text.c_str(), text.size());
+            int token = fLayoutLexer.next().fKind;
+            if (token != LayoutToken::INVALID) {
+                switch (token) {
                     case LayoutToken::LOCATION:
                         location = this->layoutInt();
                         break;
@@ -863,10 +809,10 @@
                         ctype = this->layoutIdentifier();
                         break;
                 }
-            } else if (Layout::ReadFormat(text, &format)) {
+            } else if (Layout::ReadFormat(this->text(t), &format)) {
                // AST::ReadFormat stored the result in 'format'.
             } else {
-                this->error(t, ("'" + text + "' is not a valid layout qualifier").c_str());
+                this->error(t, ("'" + this->text(t) + "' is not a valid layout qualifier").c_str());
             }
             if (this->checkNext(Token::RPAREN)) {
                 break;
diff --git a/src/sksl/SkSLParser.h b/src/sksl/SkSLParser.h
index e52eaf9..f067c48 100644
--- a/src/sksl/SkSLParser.h
+++ b/src/sksl/SkSLParser.h
@@ -15,6 +15,7 @@
 #include "SkSLErrorReporter.h"
 #include "ir/SkSLLayout.h"
 #include "SkSLLexer.h"
+#include "SkSLLayoutLexer.h"
 
 struct yy_buffer_state;
 #define YY_TYPEDEF_YY_BUFFER_STATE
@@ -51,47 +52,6 @@
  */
 class Parser {
 public:
-    enum class LayoutToken {
-        LOCATION,
-        OFFSET,
-        BINDING,
-        INDEX,
-        SET,
-        BUILTIN,
-        INPUT_ATTACHMENT_INDEX,
-        ORIGIN_UPPER_LEFT,
-        OVERRIDE_COVERAGE,
-        BLEND_SUPPORT_ALL_EQUATIONS,
-        BLEND_SUPPORT_MULTIPLY,
-        BLEND_SUPPORT_SCREEN,
-        BLEND_SUPPORT_OVERLAY,
-        BLEND_SUPPORT_DARKEN,
-        BLEND_SUPPORT_LIGHTEN,
-        BLEND_SUPPORT_COLORDODGE,
-        BLEND_SUPPORT_COLORBURN,
-        BLEND_SUPPORT_HARDLIGHT,
-        BLEND_SUPPORT_SOFTLIGHT,
-        BLEND_SUPPORT_DIFFERENCE,
-        BLEND_SUPPORT_EXCLUSION,
-        BLEND_SUPPORT_HSL_HUE,
-        BLEND_SUPPORT_HSL_SATURATION,
-        BLEND_SUPPORT_HSL_COLOR,
-        BLEND_SUPPORT_HSL_LUMINOSITY,
-        PUSH_CONSTANT,
-        POINTS,
-        LINES,
-        LINE_STRIP,
-        LINES_ADJACENCY,
-        TRIANGLES,
-        TRIANGLE_STRIP,
-        TRIANGLES_ADJACENCY,
-        MAX_VERTICES,
-        INVOCATIONS,
-        WHEN,
-        KEY,
-        CTYPE
-    };
-
     Parser(const char* text, size_t length, SymbolTable& types, ErrorReporter& errors);
 
     /**
@@ -106,8 +66,6 @@
     Position position(Token token);
 
 private:
-    static void InitLayoutMap();
-
     /**
      * Return the next token, including whitespace tokens, from the parse stream.
      */
@@ -272,10 +230,9 @@
 
     bool identifier(StringFragment* dest);
 
-    static std::unordered_map<String, LayoutToken> layoutTokens;
-
     const char* fText;
     Lexer fLexer;
+    LayoutLexer fLayoutLexer;
     YY_BUFFER_STATE fBuffer;
     // current parse depth, used to enforce a recursion limit to try to keep us from overflowing the
     // stack on pathological inputs
diff --git a/src/sksl/lex/layout.lex b/src/sksl/lex/layout.lex
new file mode 100644
index 0000000..87fc944
--- /dev/null
+++ b/src/sksl/lex/layout.lex
@@ -0,0 +1,39 @@
+LOCATION                     = "location"
+OFFSET                       = "offset"
+BINDING                      = "binding"
+INDEX                        = "index"
+SET                          = "set"
+BUILTIN                      = "builtin"
+INPUT_ATTACHMENT_INDEX       = "input_attachment_index"
+ORIGIN_UPPER_LEFT            = "origin_upper_left"
+OVERRIDE_COVERAGE            = "override_coverage"
+BLEND_SUPPORT_ALL_EQUATIONS  = "blend_support_all_equations"
+BLEND_SUPPORT_MULTIPLY       = "blend_support_multiply"
+BLEND_SUPPORT_SCREEN         = "blend_support_screen"
+BLEND_SUPPORT_OVERLAY        = "blend_support_overlay"
+BLEND_SUPPORT_DARKEN         = "blend_support_darken"
+BLEND_SUPPORT_LIGHTEN        = "blend_support_lighten"
+BLEND_SUPPORT_COLORDODGE     = "blend_support_colordodge"
+BLEND_SUPPORT_COLORBURN      = "blend_support_colorburn"
+BLEND_SUPPORT_HARDLIGHT      = "blend_support_hardlight"
+BLEND_SUPPORT_SOFTLIGHT      = "blend_support_softlight"
+BLEND_SUPPORT_DIFFERENCE     = "blend_support_difference"
+BLEND_SUPPORT_EXCLUSION      = "blend_support_exclusion"
+BLEND_SUPPORT_HSL_HUE        = "blend_support_hsl_hue"
+BLEND_SUPPORT_HSL_SATURATION = "blend_support_hsl_saturation"
+BLEND_SUPPORT_HSL_COLOR      = "blend_support_hsl_color"
+BLEND_SUPPORT_HSL_LUMINOSITY = "blend_support_hsl_luminosity"
+PUSH_CONSTANT                = "push_constant"
+POINTS                       = "points"
+LINES                        = "lines"
+LINE_STRIP                   = "line_strip"
+LINES_ADJACENCY              = "lines_adjacency"
+TRIANGLES                    = "triangles"
+TRIANGLE_STRIP               = "triangle_strip"
+TRIANGLES_ADJACENCY          = "triangles_adjacency"
+MAX_VERTICES                 = "max_vertices"
+INVOCATIONS                  = "invocations"
+WHEN                         = "when"
+KEY                          = "key"
+CTYPE                        = "ctype"
+INVALID                      = .